在这个问题上,我已经在墙上撞了很长时间,并且通过多种方式对它进行了测试,并且挖掘了源代码并且无法找出它无法正常工作的原因。
我需要一个复合过滤器,以便我可以过滤并提供其他行业标准的轮询检查。下面的代码是问题的核心部分,它位于入站通道适配器中。
如果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
答案 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
,它会首次接受该文件并将其存储在其缓存中,以便下次使用该文件。
现在我们转到链中的其他过滤器,并在此LastModifiedFileListFilter
与age == 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.7
:https://docs.spring.io/spring-integration/docs/5.0.4.RELEASE/reference/html/files.html#file-reading