如何使用Spring Integration SFTP覆盖本地文件?
解决Spring Integration SFTP客户端覆盖本地文件的问题
问题根源
默认情况下,Spring Integration SFTP的入站同步器使用AcceptOnceFileListFilter作为本地过滤器,它会缓存已处理过的文件名——只要本地存在对应文件,就会跳过后续的同步操作,哪怕远程服务器上的文件已经更新。
解决方案
要实现远程文件更新时覆盖本地文件,需要调整远程过滤器和本地过滤器的配置,让系统能识别远程文件的更新并触发重新下载:
方案1:基于文件修改时间跟踪更新(推荐)
使用SftpPersistentAcceptOnceFileListFilter作为远程过滤器,配合FileSystemPersistentAcceptOnceFileListFilter作为本地过滤器,两者通过MetadataStore持久化记录文件的状态(如远程文件的修改时间),当远程文件更新时,会自动触发覆盖本地文件。
示例Java配置:
@Bean public SftpInboundFileSynchronizer sftpInboundFileSynchronizer(SftpSessionFactory sftpSessionFactory) { SftpInboundFileSynchronizer synchronizer = new SftpInboundFileSynchronizer(sftpSessionFactory); synchronizer.setRemoteDirectory("/your/remote/path"); // 组合远程过滤器:先过滤.html文件,再跟踪文件修改状态 synchronizer.setFilter(new CompositeFileListFilter<>(Arrays.asList( new SftpSimplePatternFileListFilter("*.html"), new SftpPersistentAcceptOnceFileListFilter(new SimpleMetadataStore(), "sftp-remote-tracker-") ))); return synchronizer; } @Bean public SftpInboundFileSynchronizingMessageSource sftpMessageSource(SftpInboundFileSynchronizer synchronizer) { SftpInboundFileSynchronizingMessageSource source = new SftpInboundFileSynchronizingMessageSource(synchronizer); source.setLocalDirectory(new File("sftp-inbound")); source.setAutoCreateLocalDirectory(true); // 本地过滤器:持久化跟踪本地文件状态,配合远程更新判断 source.setLocalFilter(new FileSystemPersistentAcceptOnceFileListFilter(new SimpleMetadataStore(), "sftp-local-tracker-")); return source; }
方案2:强制覆盖所有匹配文件
如果不需要检测远程文件是否更新,只是每次同步都强制覆盖本地已存在的.html文件,可以直接将本地过滤器设置为AcceptAllFileListFilter:
@Bean public SftpInboundFileSynchronizingMessageSource sftpMessageSource(SftpInboundFileSynchronizer synchronizer) { SftpInboundFileSynchronizingMessageSource source = new SftpInboundFileSynchronizingMessageSource(synchronizer); source.setLocalDirectory(new File("sftp-inbound")); source.setAutoCreateLocalDirectory(true); // 强制接受所有本地文件(即使已存在),实现覆盖 source.setLocalFilter(new AcceptAllFileListFilter<>()); return source; }
补充说明
SftpPersistentAcceptOnceFileListFilter依赖SFTP服务器支持文件修改时间的获取,大部分主流SFTP服务器(如OpenSSH)都支持这一特性。- 如果需要更复杂的判断逻辑(比如基于文件大小、哈希值),可以自定义
FileListFilter实现类,替换上述示例中的过滤器。
内容的提问来源于stack exchange,提问作者CraigW
相关产品推荐
相关产品推荐

