You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 08:45:21