Spring Batch Integration文件监控处理报错与重复执行问题及疑惑
问题解答
一、文件重复触发的配置差异原因
- 纯Spring Integration文件复制应用:这类场景通常用
FileWritingMessageHandler处理文件,该处理器默认会移动或删除源文件(可通过deleteSourceFiles参数调整)。源文件被移除后,入站适配器下次轮询无法再检测到该文件,因此不会重复触发任务,无需额外去重配置。 - Spring Batch Integration场景:
JobLaunchingGateway仅负责启动批处理任务,默认不会修改源文件。如果不添加.preventDuplicates(true),入站适配器每次轮询都会检测到仍存在的源文件,进而重复触发任务。.preventDuplicates(true)会让入站适配器维护一份已处理文件的记录(默认用内存存储,生产环境建议搭配MetadataStore做持久化),以此跳过已处理的文件。
二、添加.log()解决DestinationResolutionException的原理
JobLaunchingGateway是请求-响应型组件:它发送批处理启动请求后,会返回对应的JobExecution执行结果。如果网关的输出通道没有订阅者消费这个响应消息,Spring Integration就会抛出DestinationResolutionException——因为找不到响应的接收方。.log()的本质是添加了一个LoggingHandler订阅者:这个处理器会消费网关返回的响应消息(将批处理执行结果打印到日志),相当于给响应消息提供了一个消费终点,解决了“无订阅者”的问题,因此异常会被消除。- 替代方案:你也可以使用
.channel(MessageChannels.nullChannel()),这个通道会静默消费消息,同样能达到解决该异常的效果。
内容的提问来源于stack exchange,提问作者of32 inc
相关产品推荐
相关产品推荐

