Spring SFTP入站适配器单文件传输后即时移动实现问题咨询
问题原因
你当前遇到的全量同步完成后才开始移动文件的现象,是Spring Integration SFTP入站适配器的默认行为导致的:SftpInboundFileSynchronizer默认会先把所有匹配过滤规则的远程文件全部同步到本地basepath目录,完成全量同步后才会逐个生成文件消息发送到sftpChannel触发移动逻辑。
解决方案
只需要调整两处配置即可实现单文件同步完成后立即处理移动:
- 调整
SftpInboundFileSynchronizingMessageSource的maxFetchSize参数为1,限制每次同步操作仅从远程拉取1个文件到本地 - 在轮询器配置中添加
maxMessagesPerPoll = "-1",让单次轮询周期内可以持续拉取文件直到远程无匹配文件,避免每5秒才拉取1个的问题
修改后的对应代码片段如下:
@Bean @InboundChannelAdapter(channel = "sftpChannel", poller = @Poller(fixedDelay = "5000", maxMessagesPerPoll = "-1")) public MessageSource<File> ftpMessageSource() { SftpInboundFileSynchronizingMessageSource source = new SftpInboundFileSynchronizingMessageSource( sftpInboundFileSynchronizer()); source.setLocalDirectory(new File(basepath)); source.setAutoCreateLocalDirectory(true); source.setLocalFilter(new AcceptOnceFileListFilter<File>()); // 每次仅拉取1个文件到本地 source.setMaxFetchSize(1); return source; }
修改后每次从远程拉取1个文件完成后,会立即生成消息触发你定义的handler执行移动逻辑,然后自动继续拉下一个匹配的文件,不需要等待全量同步完成。
补充说明
如果你的业务场景允许不先落盘到basepath直接处理,可以改用SftpStreamingInboundChannelAdapter流式读取远程文件,直接写入finalpath,减少一次本地文件IO操作。另外注意File.renameTo在跨磁盘分区的场景下会失效,建议使用Files.move方法替代保证兼容性。
内容的提问来源于stack exchange,提问作者Rishabh
相关产品推荐
相关产品推荐

