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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 09:15:02