如何为int-sftp:outbound-gateway动态创建会话工厂?

时间:2015-07-31 21:14:38

标签: spring-integration sftp

我正在尝试使用int-sftp:outbound-gateway实现安全文件传输。 我目前的配置如下所示:

<bean id="sftpSessionFactory" class="org.springframework.integration.sftp.session.DefaultSftpSessionFactory">
  <constructor-arg name="isSharedSession" value="false" />

<int:chain id="sftpGetRequestEnricherChain" input-channel="sftpGetRequestEnricherChannel" output-channel="sftpGetRequestChannel">
      <int-xml:xpath-header-enricher id="sftpHostEnricher">
         <int-xml:header name="sftp_host" xpath-expression="/fileGetRequest/property[@name='host']/@val" />
         <int-xml:header name="sftp_port" xpath-expression="/fileGetRequest/property[@name='port']/@val" />
         <int-xml:header name="sftp_user" xpath-expression="/fileGetRequest/property[@name='user']/@val" />
         <int-xml:header name="source_directory" xpath-expression="/fileGetRequest/property[@name='sourceDirectory']/@val" />
         <int-xml:header name="source_file_name" xpath-expression="/fileGetRequest/property[@name='sourceFileName']/@val" />
      </int-xml:xpath-header-enricher>
      <int:service-activator ref="refreshSftpSessionFactoryTask" />
   </int:chain>

<bean name="refreshSftpSessionFactoryTask" class="com.mycorp.filetransfer.RefreshSftpSessionFactoryTask" />

<int-sftp:outbound-gateway id="sftpGetOutboundGateway" 
      local-directory="${sftp.local.directory.get}"
      session-factory="sftpSessionFactory"
      request-channel="sftpGetRequestChannel"
      reply-channel="logChannel"
      command="get"
      expression="headers['source_directory'] + '/' + headers['source_file_name']" />

如上所示,每条消息都包含主机,端口,用户和文件路径详细信息。

在RefreshSftpSessionFactoryTask中,我正在设置主机,端口和用户详细信息并获取密码并在sftpSessionFactory bean中设置它,如下所示:

AbstractApplicationContext context = new ClassPathXmlApplicationContext(SFTP_CONFIG_FILE, this.getClass());
DefaultSftpSessionFactory sftpSessionFactory = context.getBean("sftpSessionFactory", DefaultSftpSessionFactory.class);

sftpSessionFactory.setHost(host);
sftpSessionFactory.setPort(port);
sftpSessionFactory.setUser(user);
sftpSessionFactory.setPassword(fetchPassword());
context.close();

但是,在文件传输期间,我得到一个例外,说“主机在sftpSessionFactory中不能为空”。

应该做什么才能正确设置DefaultSftpSessionFactory中的属性,并使用int-sftp:outbound-gateway查看这些属性?

1 个答案:

答案 0 :(得分:1)

您每次都在创建一个新的会话工厂并完全销毁它;你没有更新现有的。

而不是

prompt$ ./interp
scripted

只需将AbstractApplicationContext context = new ClassPathXmlApplicationContext(SFTP_CONFIG_FILE, this.getClass()); DefaultSftpSessionFactory sftpSessionFactory = context.getBean("sftpSessionFactory", DefaultSftpSessionFactory.class); 添加到您的setSessionFactory(DefaultSftpSessionFactory factory)

然后

RefreshSftpSessionFactoryTask

将会话工厂存储在字段中并使用...

<bean name="refreshSftpSessionFactoryTask" class="com.mycorp.filetransfer.RefreshSftpSessionFactoryTask">
   <property name="sessionFactory" ref="sftpSessionFactory" />
</bean>

...并且您将更新适配器使用的会话工厂。

但是,你需要非常小心线程。这种技术不会在多线程环境中工作。