Spring Integration SFTP新文件无法及时轮询问题求助
问题分析与解决方案
核心问题原因
- 消息处理速率受限:默认
@Poller的maxMessagesPerPoll值为1,意味着每次轮询(60秒)仅从本地目录取1个文件发送给处理器,导致即使首次同步了多个文件,也需要多次轮询才能处理完。 - 新文件同步时机被阻塞:由于每次轮询仅处理1个文件,初始缓存的文件未处理完时,后续轮询虽然会同步新文件,但仍优先处理本地遗留的旧文件,导致新文件无法及时被处理器接收。
解决方案
1. 调整轮询器的消息处理上限
修改@InboundChannelAdapter的Poller配置,设置maxMessagesPerPoll为足够大的值(如Integer.MAX_VALUE),让每次轮询可以处理所有已同步到本地的文件:
@Bean @InboundChannelAdapter(value = "sftpChannel", poller = @Poller(fixedRate = "60000", maxMessagesPerPoll = "#{T(java.lang.Integer).MAX_VALUE}")) public MessageSource<File> sftpInboundAdapter() { SftpInboundFileSynchronizingMessageSource source = new SftpInboundFileSynchronizingMessageSource(sftpInboundFileSynchronizer()); source.setLocalDirectory(new File("src/main/resources/localDownload/patient/")); source.setAutoCreateLocalDirectory(true); // 启用本地文件处理后删除,避免重复过滤 source.setDeleteLocalFiles(true); source.setMaxFetchSize(-1); // 显式配置本地过滤器,确保仅处理未处理过的文件 source.setLocalFilter(new AcceptOnceFileListFilter<>()); return source; }
2. 优化本地文件处理逻辑
- 设置
source.setDeleteLocalFiles(true):文件被处理器接收并处理后,自动删除本地文件,避免本地过滤器重复过滤已处理文件,同时释放本地存储空间。 - 保留
AcceptOnceFileListFilter:确保同一文件不会被重复处理,配合deleteLocalFiles,既保证幂等性,又不影响新文件的处理。
3. 确认远程同步逻辑
SftpInboundFileSynchronizer的setDeleteRemoteFiles(true)配置正确,确保远程文件被下载后立即删除,避免后续轮询重复下载。
效果验证
修改后:
- 首次17:12轮询时,SFTP上的5个文件会被同步到本地,且在本次轮询中全部被处理器接收。
- 17:14新增的文件,会在17:15的轮询中被同步到本地,并立即被处理器接收,无需等待初始文件处理完成。
内容的提问来源于stack exchange,提问作者Shail
相关产品推荐
相关产品推荐

