在这个问题上,我已经用头撞墙很长一段时间了,并通过多种方式对其进行了测试,并深入研究了源代码,但无法找出它不起作用的原因。
我需要一个复合过滤器,以便我可以过滤并提供其他行业标准轮询检查。下面的代码是问题的核心部分,它位于入站 channel 适配器中。
如果代码中没有 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
最佳答案
嗯,看来我知道问题出在哪里了。
再检查一次您的代码:
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
移动到链的末尾。
更新
另请注意自版本4.3.7
以来可用的ChainFileListFilter
:https://docs.spring.io/spring-integration/docs/5.0.4.RELEASE/reference/html/files.html#file-reading
关于java - AcceptOnceFileFilter 阻止其他过滤器在 CompositeFileListFilter 中工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39604652/