Spring boot Spring集成Sftp:有时需要超过15分钟才能完成操作
我使用SpringIntegrationSFTP将文件放在远程服务器上,下面是配置Spring boot Spring集成Sftp:有时需要超过15分钟才能完成操作,spring-boot,spring-integration,jsch,spring-integration-sftp,Spring Boot,Spring Integration,Jsch,Spring Integration Sftp,我使用SpringIntegrationSFTP将文件放在远程服务器上,下面是配置 <spring-integration.version>5.2.5.RELEASE</spring-integration.version> 这是SessionFactory的配置 public SessionFactory<LsEntry> sftpSessionFactory() { DefaultSftpSessionFactory factory = new
<spring-integration.version>5.2.5.RELEASE</spring-integration.version>
这是SessionFactory的配置
public SessionFactory<LsEntry> sftpSessionFactory() {
DefaultSftpSessionFactory factory = new DefaultSftpSessionFactory();
factory.setHost(host);
factory.setPort(port);
factory.setUser(username);
factory.setPassword(password);
factory.setAllowUnknownKeys(true);
factory.setKnownHosts(host);
factory.setSessionConfig(configPropertiesOutbound());
CachingSessionFactory<LsEntry> csf = new CachingSessionFactory<LsEntry>(factory);
csf.setSessionWaitTimeout(1000);
csf.setPoolSize(10);
csf.setTestSession(true);
return csf;
}
public SessionFactory sftpSessionFactory(){
DefaultSftpSessionFactory=新的DefaultSftpSessionFactory();
setHost(主机);
工厂设置端口(端口);
setUser(用户名);
出厂设置密码(密码);
工厂。setAllowUnknownKeys(真);
factory.setKnownHosts(主机);
setSessionConfig(configPropertiesOutbound());
CachingSessionFactory csf=新CachingSessionFactory(工厂);
csf.setSessionWaitTimeout(1000);
集落池大小(10);
csf.setTestSession(true);
返回脑脊液;
}
我已经在其中一个服务中配置了所有这些
现在问题是,
有时整个操作需要15分钟以上,特别是如果服务在几个小时内都很理想,我不确定是什么原因导致此问题。
看起来它在从CachedSessionFactory获取活动会话上花费了很多时间。操作非常快,下面是一个工具的快照,我在其中捕获了时间
传输文件通常需要几毫秒的时间
我最近做了以下修改,但在此之前我也收到了同样的问题
- 我之前已经将isShareSession设置为false,它是DefaultSftpSessionFactory=new DefaultSftpSessionFactory(true)李>
- 没有池大小,我已将其设置为10
如果我每天重新启动应用程序,它就可以正常工作。
5.2.5.发布版
-我想知道您是否能够升级到最新的5.2.9
,或者直接升级到5.4.1
:。看看它是如何工作的。可能我们之间有一些漏洞修复。当然我会尝试一下,在重构代码之前还有一件事,我已经从sessionFactory和SftpRemoteTemplate中删除了@bean,并且只将MessageHandler保留在容器中,假设它可以处理这两个问题,您认为这会导致问题吗?所有这些配置都是同一个类的一部分。不,它们必须声明为bean。处理人员没有责任关注其生命周期
@Bean
@ServiceActivator(inputChannel = "sftpOutputChannel" )
public MessageHandler genericOutboundhandler() {
SftpMessageHandler handler = new SftpMessageHandler(outboundTemplate(), FileExistsMode.APPEND);
handler.setRemoteDirectoryExpressionString("headers['remote_directory']");
handler.setFileNameGenerator((Message<?> message) -> ((String) message.getHeaders().get(Constant.FILE_NAME_KEY)));
handler.setUseTemporaryFileName(false);
return handler;
}
private SftpRemoteFileTemplate outboundTemplate;
public SftpRemoteFileTemplate outboundTemplate(){
if (outboundTemplate == null) {
outboundTemplate = new SftpRemoteFileTemplate(sftpSessionFactory());
}
return outboundTemplate;
}
public SessionFactory<LsEntry> sftpSessionFactory() {
DefaultSftpSessionFactory factory = new DefaultSftpSessionFactory();
factory.setHost(host);
factory.setPort(port);
factory.setUser(username);
factory.setPassword(password);
factory.setAllowUnknownKeys(true);
factory.setKnownHosts(host);
factory.setSessionConfig(configPropertiesOutbound());
CachingSessionFactory<LsEntry> csf = new CachingSessionFactory<LsEntry>(factory);
csf.setSessionWaitTimeout(1000);
csf.setPoolSize(10);
csf.setTestSession(true);
return csf;
}