使用动态FTP属性上传Spring Integration

时间:2016-11-29 08:34:11

标签: java spring spring-mvc spring-integration

我正在进行一个Web项目,我正在使用Spring Integration通过FTP在远程目录上上传文件。但是,FTP属性是动态加载的(来自数据库),并且每个请求的属性可能不同。天真的方法:

最初创建DefaultFtpSessionFactory bean:

@Bean
public DefaultFtpSessionFactory defaultFtpSessionFactory() {
    return new DefaultFtpSessionFactory();
}

IntegrationFlow bean:

@Bean
public IntegrationFlow integrationFlow(DefaultFtpSessionFactory defaultFtpSessionFactory) {
    // Flow config
}

将此bean注入控制器并设置属性:

@Autowired
private DefaultFtpSessionFactory defaultFtpSessionFactory;

@Autowired
private FtpConfigService ftpConfigService;

@RequestMapping(value = "upload", method = RequestMethod.GET)
public RequestEntity<String> upload() {
    defaultFtpSessionFactory.setHost(ftpConfigService.getHost());
    // Set other properties
    // ... and upload file

   return new RequestEntity<>(HttpStatus.OK);
}

当然,这是一个坏主意,因为存在竞争条件(两个请求可以在同一时间访问DefaultFtpSessionFactory单例)。那么,我怎样才能以安全的方式实现这一目标呢?

1 个答案:

答案 0 :(得分:1)

动态注册流程的最后部分 - 请参阅the blog introducing the feature;也许将这些流保存在缓存中。

有关我们动态创建多个tcp客户端适配器并缓存输入通道的示例,请参阅dynamic-tcp-client;对ftp使用类似的技术 - 还有dynamic-ftp的旧样本,它早于DSL和动态流注册。