2016-09-20 89 views
1

在這個問題上,我已經在牆上打了很長一段時間,並測試了它多種方式,並加入到源代碼中,並找不到它爲什麼不起作用。AcceptOnceFileFilter保持其他過濾器無法在CompositeFileListFilter中工作

我需要一個複合過濾器,以便我可以過濾並提供其他行業標準輪詢檢查。下面的代碼是問題的核心部分,它在入站通道適配器中。

如果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 Boot應用程序,則可以將其作爲公共應用程序使用。如果你的應用程序非常龐大,我們不打算挖掘到目前爲止。雖然你可以給我的用戶權限,看看你的私人回購: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

你介意開始一個新的SO問題更多的上下文,也許一些代碼從我們這邊玩? –