【问题标题】:Spring Integration Sftp failed to upload but simple Jsch upload is ok. Why?Spring Integration Sftp 上传失败,但简单的 Jsch 上传是可以的。为什么?
【发布时间】:2021-04-28 08:29:47
【问题描述】:

我使用 Spring Integration SFTP 将文件上传到 sftp 服务器。当我发送一些并发请求或大量文件时,我收到了 Socket Clode 异常。 但是当我使用简单的 Jsch 客户端直接发送相同的文件时,即使是并发调用,一切似乎都正常。

我对这两个库都使用默认配置。 Spring SFTP 使用 Jsch,它是否以可能导致错误的方式配置? Spring是否有特殊的配置或操作,但不是在默认配置或行为中而不是简单的Jsch?

【问题讨论】:

  • 我刚刚在我的 spring 集成 sftp 配置中看到了 isSharedSession=true。但是直接使用jsch时默认为false。
  • 解决了您的问题吗? isSharedSessionDefaultSftpSessionFactory(因此是 Spring)选项。它与jsch客户端无关。看到原始 jsch 的配置和 DefaultSftpSessionFactory 的配置有所不同真是太好了...
  • @ArtemBilan,是的,问题已解决。对不起,我之前的评论令人困惑。写得不好。当将 isSharedSession 设置为 true 时,Spring 不会关闭会话,该会话保留在池中以避免关闭/重新打开操作。它会导致某些 sftp 服务器出现一些“Socket Closed”错误(取决于它们的配置)。当使用带有专用会话 + 每个操作的通道的原始 jsch 客户端时,可以,使用 isSharedSession=false 也可以,因此在某种程度上,isSharedSession = false 可以被视为等同于每个操作打开/关闭的原始 jsch 操作。
  • 知道了。您介意将其解释为您自己问题的答案吗?这将在未来帮助其他有类似问题的社区
  • @ArtemBilan,复制了我的评论作为答案。但我剩下的问题是为什么它失败了?您知道为什么某些服务器(取决于它们的配置)在将 isSharedSession 选项设置为 true 的 spring 客户端无法正常工作吗?

标签: spring-integration sftp jsch spring-integration-sftp


【解决方案1】:

问题已解决。当将 isSharedSession 设置为 true 时,Spring 不会关闭会话,该会话保留在池中以避免关闭/重新打开操作。它会导致某些 sftp 服务器出现一些“Socket Closed”错误(取决于它们的配置)。当使用带有专用会话 + 每个操作的通道的原始 jsch 客户端时,可以,使用 isSharedSession=false 也可以,因此在某种程度上,isSharedSession = false 可以被视为等同于每个操作打开/关闭的原始 jsch 操作

【讨论】:

  • 所以,是的...不建议使用共享会话进行并发活动。在大多数情况下,我们只需要在入站通道适配器上进行这样的单个会话,它通常是一个单线程轮询组件:docs.spring.io/spring-integration/docs/current/reference/html/…。对于并发发送,最好让会话通过CachingSessionFactory 产生并分别重用。
  • 我已经在使用 CachingSessionFactory。当我与共享会话一起使用时,它失败了。 isShareSession=false 没关系
  • 但是 Spring docs sans isSharedSession=true 应该与 CachingsessionFactory 一起使用,但有时会失败
  • 我没有看到那句话,但这仍然可能是关于在入站通道适配器中读取:而不是在出站通道适配器中写入,尤其是当它是并发且长期存在的时候。
【解决方案2】:

解决问题的 Bean 配置:

@Bean("speosSessionFactory")
public SessionFactory<ChannelSftp.LsEntry> speosSftpSessionFactory(ApplicationProperties applicationProperties) {
    DefaultSftpSessionFactory factory = new DefaultSftpSessionFactory(false);
    factory.setHost(applicationProperties.getHost());
    factory.setPort(applicationProperties.getPort());
    factory.setUser(applicationProperties.getUser());
    if (applicationProperties.getPrivateKey() != null) {
        factory.setPrivateKey(applicationProperties.getPrivateKey());
        factory.setPrivateKeyPassphrase(applicationProperties.getPrivateKeyPassphrase());
    } else {
        factory.setPassword(applicationProperties.getPassword());
    }
    factory.setAllowUnknownKeys(true);
    return new CachingSessionFactory<>(factory, applicationProperties.getMaxSessions());
}

【讨论】:

    猜你喜欢
    • 2022-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-02
    • 2013-11-17
    相关资源
    最近更新 更多