データソースおよびマニピュレータはスレッド・セーフである必要があります。
次のいずれかのメソッドの実行中に、
stop()メソッドを同時にコールできます。
- DataSouceRuntime.runFullAcquisition()
- ManipulatorRuntime.processRecord()
- ManipulatorRuntime.onInputClose()
- IncrementalDataSourceRuntime.runIncrementalAcquisition()
データソースに関する推奨事項
スレッド・セーフにするための要件には、データソースの実装に関係するものがいくつかあります。
- runFullAcquisition()と共有される状態はいずれも、stop()と同期する必要があります。状態は、checkFullAcquisitionRequired()およびバイナリ・コンテンツ・インタフェース(BinaryContentFileProviderおよびBinaryContentInputStreamProvider)と共有できます。
- BinaryContentFileProviderインタフェースまたはBinaryContentInputStreamProviderインタフェースのいずれかを実装することによってテキスト抽出をサポートしている場合、IAS Serverが複数のスレッドからBinaryContentFileProvider.getBinaryContentFile()またはBinaryContentInputStreamProvider.getBinaryContentInputStream()をコールするので、データソースがスレッド・セーフである必要があります。
マニピュレータに関する推奨事項
スレッド・セーフにするための要件には、マニピュレータの実装に関係するものがいくつかあります。
- 可能な場合、ローカル変数または最終的な不変フィールドのみを使用します。
- どうしても必要な場合にのみ、processRecord()またはonInputClose()へのコールにおいて内部状態を維持します。必要な場合、同期して状態にアクセスします。
パフォーマンスを最適にするには、processRecord()においてロックを保持する時間を最小限にすることをお薦めします。
マニピュレータでは、OutputChannel.output()をprocessRecord()からコールするときにはロックを保持しないでください。output()へのコールは、戻るのに時間がかかり、同時にprocessRecord()をコールしている他のスレッドをブロックしてしまう場合があります。ロックを保持する1つの方法では、メソッド用のJava同期キーワードを使用します。ただし、processRecord()を同期すると、パフォーマンスに悪影響が及びます。他のスレッドがprocessRecord()に入るのを防ぐことによって効果的に同期すると、マニピュレータがシングル・スレッドになります。
構成とコンテキスト同期
拡張機能の実装の一部として、IAS ServerはPipelineComponentConfigurationオブジェクトおよびPipelineComponentRuntimeContextオブジェクトをDataSource.createDataSourceRuntime() (データソースの場合)およびManipulator.createManipulatorRuntime() (マニピュレータの場合)のいずれかに渡します。IAS Serverは、createManipulatorRuntime()またはcreateDataSourceRuntime()がコールされた後に、PipelineComponentConfigurationを変更しません。
IAS Serverが取得を実行するときは、PipelineComponentRuntimeContextおよびこのオブジェクトからアクセスできるすべてのものがスレッド・セーフになります。