Java Spring SFTP连接没有重新连接?

时间:2018-02-19 18:26:00

标签: java spring spring-integration

使用以下配置设置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);
    }
}

1 个答案:

答案 0 :(得分:1)

导致问题的环境中的防火墙正在放弃长时间运行的“缓存”会话。它似乎刚刚被删除,SFTP连接没有检查连接是否仍处于活动状态。

修复方法是删除缓存会话工厂。这样做的影响是复制过程在每次操作后登录。例如,登录并生成目录。再次登录并复制该文件。