使用不同的 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 服务器上的目录有不同的逻辑,我需要两个 SftpMessageHandlers
和 MessagingGateways
吗?
现在我认为作为创建两个 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
名称
目前我将所有生成的文件上传到单个 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 服务器上的目录有不同的逻辑,我需要两个 SftpMessageHandlers
和 MessagingGateways
吗?
现在我认为作为创建两个 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
名称