Spring Integration中preventDuplicates(false)及patternFilter失效问题
问题原因与解决方案
核心问题:过滤器配置的覆盖逻辑
patternFilter()和preventDuplicates()都是直接替换文件过滤器的属性,后调用的方法会完全覆盖前一个方法设置的过滤器:
- 你的代码先调用
patternFilter("*.txt"),此时过滤器被设为SimplePatternFileListFilter(仅按文件名模式过滤); - 随后调用
preventDuplicates(false),过滤器被替换为AcceptAllFileListFilter(接受所有文件),这就是*.csv被处理、模式过滤失效的原因。
为什么你觉得preventDuplicates(false)没生效?
这是测试场景的误导:你配置了deleteSourceFiles(true),源文件会被自动删除,in目录中不会留下重复文件供后续轮询处理。如果要验证重复文件处理逻辑,需要去掉deleteSourceFiles(true),或者手动将同名、同大小、同修改时间的文件重新放入in目录。
正确配置方式
要同时实现「仅处理*.txt文件」和「允许重复处理同属性文件」,有两种可行方案:
方案1:调整调用顺序
先设置preventDuplicates(false),再设置patternFilter,此时过滤器会被替换为SimplePatternFileListFilter(仅过滤文件名,不做重复检查):
@Bean public IntegrationFlow readBackUpFlow() { return IntegrationFlows .from( Files .inboundAdapter(new File("d:/temp/in")) .preventDuplicates(false) .patternFilter("*.txt") .get(), e -> e.poller(Pollers.fixedDelay(5000)) ) .log("File", m -> m) .transform(Files.toStringTransformer()) .log("Content", m -> m) .handle((p, h) -> h.get(FileHeaders.ORIGINAL_FILE, File.class)) .handle(Files.outboundAdapter(new File("d:/temp/done")).deleteSourceFiles(true)) .get(); }
方案2:手动构建复合过滤器
如果需要添加多个过滤规则,可以使用CompositeFileListFilter组合不同的过滤逻辑:
@Bean public IntegrationFlow readBackUpFlow() { CompositeFileListFilter<File> compositeFilter = new CompositeFileListFilter<>(); compositeFilter.addFilter(new SimplePatternFileListFilter("*.txt")); compositeFilter.addFilter(new AcceptAllFileListFilter()); // 不阻止重复文件 return IntegrationFlows .from( Files .inboundAdapter(new File("d:/temp/in")) .filter(compositeFilter) .get(), e -> e.poller(Pollers.fixedDelay(5000)) ) .log("File", m -> m) .transform(Files.toStringTransformer()) .log("Content", m -> m) .handle((p, h) -> h.get(FileHeaders.ORIGINAL_FILE, File.class)) .handle(Files.outboundAdapter(new File("d:/temp/done")).deleteSourceFiles(true)) .get(); }
关于断点未触发的说明
原代码中AcceptAllFileListFilter未被触发,是因为后续的过滤器配置覆盖了它。在正确配置后,对应的过滤器会正常执行,断点可以捕获到。
内容的提问来源于stack exchange,提问作者lafual
相关产品推荐
相关产品推荐

