java - AcceptOnceFileFilter 阻止其他过滤器在 CompositeFileListFilter 中工作

标签 java spring spring-integration

在这个问题上,我已经用头撞墙很长一段时间了,并通过多种方式对其进行了测试,并深入研究了源代码,但无法找出它不起作用的原因。

我需要一个复合过滤器,以便我可以过滤并提供其他行业标准轮询检查。下面的代码是问题的核心部分,它位于入站 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/

相关文章:

java - Kafka序列化-反序列化问题

java - 枚举示例中的语法

java - Office 365 Activity 日志

java - 如何使用 Spring Integration 访问邮箱文件夹

Spring Security 用户名密码AuthenticationFilter : How to access Request after a failed login

spring-integration - 如何在Spring集成中模拟出站网关

java - 如何将这个 if-else 简化为一条语句?

java - Eclipse:如何在某些评论中有选择地禁用拼写检查

java - 关于重写 SimpleUrlAuthenticationFailureHandler 的说明

java - 如何使用so-linger保持服务器连接一段时间