Spring Integration SMB多文件传输延迟问题咨询与优化
问题分析与解决方案
核心问题
你遇到的单文件传输6-7秒延迟,根源是每个文件传输都新建SMB连接。SMB连接的建立包含协议协商、身份认证等环节,这些操作的开销正好对应你看到的延迟时长。而下游(远程到本地)场景中,SmbInboundFileSynchronizer会在一次轮询中复用同一个SMB会话处理所有文件,因此没有重复建立连接的开销。
解决方案
通过会话缓存复用SMB连接,同时优化文件传输流程,避免不必要的转换。
1. 配置SMB会话缓存
使用Spring Integration的CachingSessionFactory包装原有的SmbSessionFactory,实现会话复用:
@Bean public SessionFactory<SmbFile> cachingSmbSessionFactory() { return new CachingSessionFactory<>(smbSessionFactory()); }
2. 修改集成流,使用缓存会话工厂并去掉冗余转换
原配置中的Files.toStringTransformer()会把文件内容转成字符串再写入SMB,既增加内存开销,也不是必要操作。直接传输文件对象更高效,同时让出站适配器复用缓存的会话:
@Bean public IntegrationFlow fileToSmbSyncFlow() { return IntegrationFlow.from( Files.inboundAdapter(new File("myLocalDirectory")) .preventDuplicates(false), e -> e.poller(Pollers.fixedDelay(1000).maxMessagesPerPoll(-1)) ) .handle(Smb.outboundAdapter(cachingSmbSessionFactory(), FileExistsMode.REPLACE) .useTemporaryFileName(true) .remoteDirectory("/remoteDirectory"), e -> e.advice(originalFileDeletionAdvice()) ) .get(); }
效果说明
配置修改后,SMB连接会被缓存复用,第一次传输建立连接后,后续文件都使用已有会话,彻底消除重复建立连接的6-7秒延迟,多文件传输间隔会接近你的预期(约1秒)。
内容的提问来源于stack exchange,提问作者mrnst
相关产品推荐
相关产品推荐

