受信チャネルアダプター: リモートファイルフェッチの制御
受信チャネルアダプターを構成するときは、2 つのプロパティを考慮する必要があります。max-messages-per-poll は、すべてのポーラーと同様に、各ポーリングで送信されるメッセージの数を制限するために使用できます(構成された値を超える準備ができている場合)。max-fetch-size (バージョン 5.0 以降)は、一度にリモートサーバーから取得するファイルの数を制限できます。
次のシナリオでは、開始状態が空のローカルディレクトリであると想定しています。
max-messages-per-poll=2およびmax-fetch-size=1: アダプターは、1 つのファイルを取り出して発行し、次のファイルを取り出して発行します。その後、次のポーリングまでスリープします。max-messages-per-poll=2およびmax-fetch-size=2: アダプターは両方のファイルを取得し、それぞれを発行します。max-messages-per-poll=2およびmax-fetch-size=4: アダプターは最大 4 つのファイル(利用可能な場合)を取得し、最初の 2 つのファイル(少なくとも 2 つある場合)を出力します。次の 2 つのファイルは次回のポーリングで出力されます。max-messages-per-poll=2とmax-fetch-sizeが指定されていない場合: アダプターはすべてのリモートファイルをフェッチし、最初の 2 つ(少なくとも 2 つある場合)を出力します。残りのファイルは、後続のポーリングで(一度に 2 つずつ)出力されます。すべてのファイルが消費されると、リモートフェッチが再度試行され、新しいファイルを取得します。
アプリケーションの複数のインスタンスをデプロイするときは、小さな max-fetch-size を設定して、1 つのインスタンスがすべてのファイルを「取得」し、他のインスタンスを枯渇させないようにすることをお勧めします。 |
max-fetch-size のもう 1 つの用途は、リモートファイルのフェッチを停止するが、すでにフェッチされているファイルの処理を続行したい場合です。MessageSource で maxFetchSize プロパティを (プログラム的に、JMX 経由、または制御バス経由で) 設定すると、アダプターによるさらなるファイルのフェッチが効果的に停止されますが、ポーラーは以前にフェッチされたファイルに対するメッセージの出力を継続できるようになります。プロパティの変更時にポーラーがアクティブな場合、変更は次のポーリングで有効になります。
バージョン 5.1 以降、シンクロナイザーに Comparator<?> を提供できます。これは、maxFetchSize でフェッチされるファイルの数を制限するときに役立ちます。
バージョン 6.4 以降、AbstractRemoteFileStreamingMessageSource には、処理されていないリモートファイルへの参照をキャッシュから削除するための便利な clearFetchedCache() API が追加されました。ポーリング設定では 1 サイクルですべての参照を処理できないため、参照はキャッシュに残ります。また、対象となる SessionFactory は、ポーリングサイクル間で(たとえば RotatingServerAdvice を介して)変更される可能性があります。
バージョン 7.0 以降、AbstractInboundFileSynchronizer は maxFetchSize スライスを適用した後、フィルタリングされた Session.list(remoteDirectory) をキャッシュします。AbstractInboundFileSynchronizer.transferFilesFromRemoteToLocal() メソッドのロジックは次のとおりです。
maxFetchSize > 0の場合、キャッシュ周辺で作業が行われる際に、異なるスレッド間の競合状態を回避するため、remoteDirectoryに対してロックが取得されます。以降の同期処理はすべてメモリ内にキャッシュされた残りのデータのみを処理するため、パフォーマンスの低下は最小限に抑えられます。remoteDirectoryのキャッシュエントリがない場合、Session.list(remoteDirectory)が呼び出され、返されたすべての リモートファイルがフィルター処理されます。フィルタリングされた結果は
maxFetchSizeにスライスされます。これらのファイルエントリはローカルディレクトリに転送されます。
フィルタリングされた残りの リモートファイルは、後で同期するためにキャッシュされます。
remoteDirectoryのキャッシュエントリがある場合、そのようなリストは maxFetchSize にスライスされ、ローカルディレクトリへの転送のために反復されます。いずれかの転送が失敗した場合、
filterは失敗したリモートファイルからリセットされます。キャッシュも削除されるため、次回の同期はクリーンな状態から開始されます。
FileListFilter 構成に関する情報については、一般的な SFTP 受信チャネルアダプターの章も参照してください。