2016-09-20 7 views
1

私はこの問題で長時間壁に頭を打ち、複数の方法でテストし、ソースコードを掘り下げて動作しない理由を調べることができません。AcceptOnceFileFilterはCompositeFileListFilter内で他のフィルタが動作しないようにします

私はフィルターをかけて他の業界標準のポーリングチェックを提供できるように、複合フィルターが必要です。以下のコードは問題の中核部分であり、Inbound Channel Adapterにあります。

addFilter(新しいAcceptOnceFileListFilter())がコードにない場合、コードは正常に機能します。それを置くと、すぐにファイルが見つかりません。 RegexPatternFileListFilterをシナリオの外に出すと動作します。

CompositeFileListFilter<File> compositeFileListFilter= new CompositeFileListFilter<File>(); 
compositeFileListFilter.addFilter(new RegexPatternFileListFilter(".*_CLAIM_.*[.]txt")); 
compositeFileListFilter.addFilter(new AcceptOnceFileListFilter<File>()); 
compositeFileListFilter.addFilter(lastModifiedFilter()); 

FileReadingMessageSource pollDirectory = new FileReadingMessageSource();  
pollDirectory.setDirectory(new File(pollingDirectory)); 
pollDirectory.setAutoCreateDirectory(false); 
pollDirectory.setFilter(compositeFileListFilter); 
pollDirectory.setLocker(new NioFileLocker()); 

アップデート2016年9月21日:この問題を示す 例の春ブートアプリケーションがにアップロードされました: https://github.com/tedwards-rogue/AcceptOnceFileFilter-Test

+0

私たちの側から遊ぶために、いくつかのSpring Bootアプリケーションを思いつくのは難しいでしょうか?少なくとも、Spring Integrationカテゴリのデバッグログを提供してください。 –

+0

コードをPivotalの皆さんに直接バンドルする方法はありますか?これは現時点では私的なGitリポジトリにあります。 –

+0

これは、単純な一般的なSpringブートアプリケーションであれば、公開することができます。あなたのアプリが非常に大きい場合、私たちはこれまでに掘り下げることを意図していません。自分のプライベートレポを表示する権限をユーザーに与えることはできますが、https://github.com/artembilan –

答えて

1

さて、問題がどこにあるか私が知っているように見えます。あなたのコードに

ルックもう一回:

CompositeFileListFilter<File> compositeFileListFilter= new CompositeFileListFilter<File>(); 
compositeFileListFilter.addFilter(new RegexPatternFileListFilter("(?i).*_CLAIM_.*[.]txt")); 
compositeFileListFilter.addFilter(new AcceptOnceFileListFilter<File>()); 
compositeFileListFilter.addFilter(lastModifiedFilter()); 
compositeFileListFilter.addFilter(new IgnoreHiddenFileListFilter()); 

を参照してください、あなたはので、フィルタの誤った順序でトラップしています。

中間にAcceptOnceFileListFilterがある場合は、ファイルを最初に受け入れ、そのキャッシュに保存して次回のキャッシュを回避します。

ここで、チェーン内の他のフィルタに行き、LastModifiedFileListFilterage == 15秒で満たします。今すぐJavaDocs:

* The {@link FileListFilter} implementation to filter those files which 
* {@link File#lastModified()} is less than the {@link #age} in comparison 
* with the current time. 
* <p> 
* The resolution is done in seconds. 

したがって、ファイルが十分に若ければ、私たちはそれをスキップします。最終的にファイルは古くなるが、(!!!)。あなたは以前にAcceptOnceFileListFilterがあることを覚えていますか?したがって、たとえそのファイルがLastModifiedFileListFilterによって処理の準備ができていても、すでにAcceptOnceFileListFilterによってフィルタリングされているため、私たちは合格しません。

したがって、問題の修正はAcceptOnceFileListFilterをチェーンの最後に移動することです。

+0

私はあなたが正しいことを確認しました。私は自分自身の注文について疑問を抱いていましたが、その結論に至るドキュメントやJavaのドキュメントで何も見つけることができませんでした。たぶんこれは特定のエッジケースですが、おそらくAcceptOnceFileListFilterのコードのコメントが役に立ちます。迅速な対応をありがとう。 –

+0

私は同じ問題に直面していますが、順序を変更してもCompositeFileListFilter.filterFilesメソッドがすべてのファイルがすべてのフィルタに送信されることを示しています – Shahbour

+0

より多くのコンテキストと多分私たちの側から再生するいくつかのコード? –

関連する問題