gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 07:08:38 31 4
gpt4 key购买 nike

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

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

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com