使用以下配置设置Spring SFTP。在某些环境中,它可以在启动时运行,但是在等待“连接超时”错误消息15分钟后,后续副本将失败。
如果重播,副本将在“大部分时间”再次运行。
配置
/**
* Create a SFTP session factory.
*/
@Bean
public SessionFactory<ChannelSftp.LsEntry> sftpSessionFactory() {
// TODO check isSharedSession
DefaultSftpSessionFactory factory = new DefaultSftpSessionFactory(false);
factory.setHost(host);
factory.setPort(port);
factory.setUser(user);
if (privateKey != null) {
factory.setPrivateKey(privateKey);
factory.setPrivateKeyPassphrase(keyPhrase);
} else {
factory.setPassword(password);
}
factory.setAllowUnknownKeys(allowUnknownKeys);
return new CachingSessionFactory<ChannelSftp.LsEntry>(factory);
}
使用远程文件模板,以便我们可以在远程服务器上设置名称。是Spring SFTP也会重命名远程服务器上的文件。如果首先重命名文件,则可以使用“网关”。
@SuppressWarnings("unchecked")
public void send(File sourceFilePath, File intermediateFileName, File destinationFileName, String remoteDirectory) throws PaymentsPlusSystemException {
SftpRemoteFileTemplate sftpRemoteFileTemplate = new SftpRemoteFileTemplate(sftpSessionFactory);
sftpRemoteFileTemplate.setAutoCreateDirectory(Boolean.TRUE);
sftpRemoteFileTemplate.setRemoteDirectoryExpression(new LiteralExpression(remoteDirectory));
sftpRemoteFileTemplate.setBeanFactory(context);
try {
sftpRemoteFileTemplate.afterPropertiesSet();
sftpRemoteFileTemplate.send(new GenericMessage<Object>(sourceFilePath));
String intermediateFileFull = remoteDirectory + "/" + intermediateFileName.getPath();
String destinationFileFull = remoteDirectory + "/" + destinationFileName.getPath();
sftpRemoteFileTemplate.rename(intermediateFileFull, destinationFileFull);
} catch (Exception e) {
throw new CopySystemException(String.format("Refund batch. Copying files. Failed to send file. %s. %s", e.getLocalizedMessage(), e.getClass().getName()), e);
}
}
答案 0 :(得分:1)
导致问题的环境中的防火墙正在放弃长时间运行的“缓存”会话。它似乎刚刚被删除,SFTP连接没有检查连接是否仍处于活动状态。
修复方法是删除缓存会话工厂。这样做的影响是复制过程在每次操作后登录。例如,登录并生成目录。再次登录并复制该文件。