AcceptOnceFileFilter使其他过滤器不在CompositeFileListFilter中工作

时间:2016-09-20 22:24:38

标签: java spring spring-integration

在这个问题上,我已经在墙上撞了很长时间,并且通过多种方式对它进行了测试,并且挖掘了源代码并且无法找出它无法正常工作的原因。

我需要一个复合过滤器,以便我可以过滤并提供其他行业标准的轮询检查。下面的代码是问题的核心部分,它位于入站通道适配器中。

如果addFilter(new 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日更新: 显示此问题的示例Spring Boot应用程序已上载到: https://github.com/tedwards-rogue/AcceptOnceFileFilter-Test

1 个答案:

答案 0 :(得分: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移至链的末尾。

<强>更新

另请注意版本ChainFileListFilter后可用的4.3.7https://docs.spring.io/spring-integration/docs/5.0.4.RELEASE/reference/html/files.html#file-reading