使用不同的 sftp 会话工厂

Using different sftp session factories

目前我将所有生成的文件上传到单个 SFTP 并且一切正常。但要求已更改,我需要在不同的 SFTP 服务器上上传文件。 例子: 在 REST 端点上,我收到请求 type=FULL,然后我需要将文件上传到 SFTP1,如果 type=PART,那么我需要上传到 SFTP2 .

我的 sftp 配置:

  @Bean
  public SessionFactory<ChannelSftp.LsEntry> sftpSessionFactory() {
    final DefaultSftpSessionFactory factory = new DefaultSftpSessionFactory(true);
    factory.setHost(properties.getHost());
    factory.setPort(properties.getPort());
    factory.setUser(properties.getUser());
    factory.setPassword(properties.getPassword());
    factory.setAllowUnknownKeys(true);
    return factory;
  }

  @Bean
  @ServiceActivator(inputChannel = "toSftpChannel")
  public MessageHandler handler(@Value("'${sftp.folder}'.concat(headers['type'])")
                                  final String remoteDirectory) {
    final SftpMessageHandler handler = new SftpMessageHandler(sftpSessionFactory());
    handler.setRemoteDirectoryExpressionString(remoteDirectory);
    handler.setAutoCreateDirectory(true);
    return handler;
  }

@MessagingGateway
public interface SftpService {

  @Gateway(requestChannel = "toSftpChannel")
  void uploadFileToSftp(@Payload File file,
                        @Header("filename") String filename,
                        @Header("type") String type);
}

是否可以创建 2 个会话工厂并在某些条件下使用它们?

此外,如果我对第一个和第二个 SFTP 服务器上的目录有不同的逻辑,我需要两个 SftpMessageHandlersMessagingGateways 吗?

现在我认为作为创建两个 SftpService 接口的解决方案,两包配置和应用程序逻辑更改上传位置。

通过创建第二个解决

@Bean
  public SessionFactory<ChannelSftp.LsEntry> sftpSessionFactory() {
    final DefaultSftpSessionFactory factory = new DefaultSftpSessionFactory(true);
    factory.setHost(properties.getHost());
    factory.setPort(properties.getPort());
    factory.setUser(properties.getUser());
    factory.setPassword(properties.getPassword());
    factory.setAllowUnknownKeys(true);
    return factory;
  }

用于第二个 sftp 连接,并实现了第二个

@Bean
  @ServiceActivator(inputChannel = "toSftpChannel")
  public MessageHandler handler(@Value("'${sftp.folder}'.concat(headers['type'])")
                                  final String remoteDirectory) {
    final SftpMessageHandler handler = new SftpMessageHandler(sftpSessionFactory());
    handler.setRemoteDirectoryExpressionString(remoteDirectory);
    handler.setAutoCreateDirectory(true);
    return handler;
  }

@MessagingGateway
public interface SftpService {

  @Gateway(requestChannel = "toSftpChannel")
  void uploadFileToSftp(@Payload File file,
                        @Header("filename") String filename,
                        @Header("type") String type);
}

具有不同的 inputChannel 名称