Spring Integration DynamicFtpChannelResolver - 无法自动装配服务bean

时间:2014-10-28 15:49:46

标签: spring-integration

我已经实现了spring集成示例中的 DynamicFtpChannelResolver ,以便在我的集成应用程序中允许动态FTP位置。

作为出站适配器的一部分,我添加了一个建议链。 FtpCompleteAdvice 需要访问现有的服务bean,但在运行时这不会被注入,因为上下文是动态创建的。

是否有办法让自动装配工作或以其他方式访问此服务bean?

以下是xml的摘录:



<int:channel id="toFtpChannel" />

<bean id="ftpClientFactory" class="org.springframework.integration.sftp.session.DefaultSftpSessionFactory">
  <property name="host" value="${host}" />
  <property name="port" value="${port}" />
  <property name="user" value="${user}" />
  <property name="password" value="${password}" />
</bean>

<int-sftp:outbound-channel-adapter id="ftpOutbound" session-factory="ftpClientFactory" channel="toFtpChannel" remote-directory="${remote.directory}" remote-file-separator="/" remote-filename-generator-expression="headers.filename">
  <int-sftp:request-handler-advice-chain>
    <bean class="org.springframework.integration.handler.advice.RequestHandlerRetryAdvice">
      <property name="retryTemplate" ref="retryTemplate" />
    </bean>
    <bean class="com.bstonetech.ptms.integration.util.FtpCompleteAdvice">
      <property name="interfaceType" value="OUTBOUND" />
      <property name="interfaceName" value="TEST" />
    </bean>
  </int-sftp:request-handler-advice-chain>
</int-sftp:outbound-channel-adapter>

<bean id="retryTemplate" class="org.springframework.retry.support.RetryTemplate">
  <property name="retryPolicy">
    <bean class="org.springframework.retry.policy.SimpleRetryPolicy">
      <property name="maxAttempts" value="3" />
    </bean>
  </property>
  <property name="backOffPolicy">
    <bean class="org.springframework.retry.backoff.ExponentialBackOffPolicy">
      <property name="maxInterval" value="600000" />
      <property name="initialInterval" value="3000" />
      <property name="multiplier" value="2" />
    </bean>
  </property>
</bean>
&#13;
&#13;
&#13;

public class FtpCompleteAdvice extends AbstractRequestHandlerAdvice {

      @Autowired
      private IEmailUtilities emailUtilities;
      @Autowired
      private IFileService fileService;

      private String interfaceType;
      private String interfaceName;

      public void setInterfaceType(String interfaceType) {
         this.interfaceType = interfaceType;
      }

      public void setInterfaceName(String interfaceName) {
         this.interfaceName = interfaceName;
      }

      @Override
      protected Object doInvoke(ExecutionCallback callback, Object target, Message<?> message) throws          Exception {

      Object result = callback.execute();
      String filename = (String)message.getHeaders().get("filename");

      //insert ftp row into file_ctl

      fileService.insertFtpFile(filename, interfaceName, interfaceType, new Date());

      //send email to confirm ftp

      emailUtilities.afterFtp(filename, interfaceName);
      return result;
   }
}

1 个答案:

答案 0 :(得分:0)

您需要使新上下文成为具有这些bean的主上下文的子项。当对入站端点使用类似的技术时,会在示例的README中引用的论坛帖子中讨论这一点。

然后,父上下文中的任何bean都可用于连接。