最新の安定バージョンについては、Spring Integration 7.1.0 を使用してください!

リモート永続ファイルリストフィルター

受信およびストリーミング受信リモートファイルチャネルアダプター(FTPSFTP、その他のテクノロジ)は、デフォルトで対応する AbstractPersistentAcceptOnceFileListFilter 実装で構成され、メモリ内 MetadataStore が構成されています。クラスタで実行する場合、これらを共有 MetadataStore を使用したフィルターに置き換えることができます(詳細はメタデータストアを参照してください)。これらのフィルターは、同じファイルが複数回取得されるのを防ぐために使用されます(ファイルの更新時刻が変更されない限り)。バージョン 5.2 以降では、ファイルが取得される直前にフィルターに追加され(取得に失敗した場合は元に戻されます)、ファイル取得に失敗した場合はフィルターが元に戻されます。

バージョン 7.0 以降、すべての AbstractPersistentAcceptOnceFileListFilter 実装は、メタデータエントリキーに「長いファイル名」(取得ディレクトリと単純なファイル名)を使用します。以前は、同じフィルターを異なるディレクトリで同じファイル名で使用した場合、ファイル名のみでメタデータの上書き問題が発生する可能性がありました。たとえば、RotatingServerAdvice はタイムスタンプに基づいてディレクトリを切り替えますが、ビジネスロジックに従ってファイルは同じ名前でそこに配置されます。directory1 と directory2 に someFile が含まれている場合、それらのメタデータはそれぞれ directory1/someFile と directory2/someFile に格納されます。これは、フィルターの prefix オプションが空文字列として指定されている場合に該当し、そうでない場合は、そのようなプレフィックスが最終キーに追加されます。

致命的な障害(停電など)が発生した場合、現在フェッチされているファイルがフィルターに残り、アプリケーションの再起動時に再フェッチされない可能性があります。この場合、このファイルを MetadataStore から手動で削除する必要があります。

以前のバージョンでは、ファイルは取得される前にフィルタリングされていたため、壊滅的な障害が発生した後、いくつかのファイルがこの状態になる可能性がありました。

この新しい動作を容易にするために、FileListFilter に 2 つの新しいメソッドが追加されました。

boolean accept(F file);

boolean supportsSingleFileFiltering();

フィルターが supportsSingleFileFiltering で true を返す場合、accept() を実装する必要があります。

リモートフィルターが単一ファイルのフィルター処理(AbstractMarkerFilePresentFileListFilter など)をサポートしない場合、アダプターは以前の動作に戻ります。

複数のフィルター (CompositeFileListFilter または ChainFileListFilter) が使用されている場合、複合フィルターが単一ファイルフィルタリングをサポートするには、すべての委譲フィルターが単一ファイルフィルタリングをサポートする必要があります。

永続ファイルリストフィルターにブールプロパティ forRecursion が追加されました。このプロパティを true に設定すると、alwaysAcceptDirectories も設定されます。これは、送信ゲートウェイ(ls および mget)での再帰操作が常にディレクトリツリー全体を毎回トラバースすることを意味します。これは、ディレクトリツリーの奥深くで変更が検出されなかった問題を解決するためです。さらに、forRecursion=true により、ファイルへのフルパスがメタデータストアキーとして使用されます。これにより、同じ名前のファイルが異なるディレクトリに複数回表示された場合にフィルターが正しく機能しなかった問題が解決されます。重要: これは、永続メタデータストア内の既存のキーが、最上位ディレクトリにあるファイルで見つからないことを意味します。このため、プロパティはデフォルトで false です。これは将来のリリースで変更される可能性があります。