2017-01-03 51 views
0

如何僅在成功的FTP文件傳輸時觸發將消息發送到JdbcOutboundGateway?通過彈簧集成發送成功的FTP文件上傳消息

我有下面的IntegrationFlow。它可以根據需要上傳文件到FTP服務器。但是,我需要向DB寫入文件已成功上傳,或者如果FTP上載失敗,則更新記錄。我無法確定如何在文件傳輸成功時啓動數據庫更新。無論我在哪裏嘗試繼續流程,它都會拋出一個異常,指出它是「單向」的。

  • ftpProps包含所有用於各種FTP設置
  • outboundMessages的配置值是消息被放置到需要經由FTP要發送的信道
  • ftpSessionFactoryFactory構建出從值的所有的各種FtpSessionFactory對象在配置文件中,所述路由器將隨後確定發送消息通過檢查報頭值

流其中之一:

@Bean 
public IntegrationFlow fromOutboundChannelToFtp(OutboundConfigurationProperties ftpProps, 
               @Qualifier(OUTBOUND_CHANNEL) MessageChannel outboundMessages, 
               @Qualifier(FTP_SESSION_FACTORY_FACTORY) FtpSessionFactoryFactory ftpSessionFactoryFactory) { 
    return IntegrationFlows.from(outboundMessages) 
      .route(RECEIVER_HEADER_SPEL, mapping -> { 
       for (String receiverId : ftpProps.getFtp().keySet()) { 
        mapping.subFlowMapping(receiverId, sf -> { 
         sf.handleWithAdapter(adapter -> 
          adapter.ftp(ftpSessionFactoryFactory.getFactory(receiverId)) 
          .fileNameExpression(FILENAME_HEADER_SPEL) 
          .autoCreateDirectory(true) 
          .remoteDirectory(ftpProps.getValue(receiverId, FtpProp.DIRECTORY)) 
         ); 
        }); 
       } 
      }) 
      .get(); 
} 

回答

1

使outboundMessages成爲發佈/訂閱通道並使用JDBC適配器訂閱第二個流。在路由器和jdbc適配器使用者上設置order屬性,以確保它們按正確的順序調用。

默認情況下,如果第一個使用者失敗,則不會調用第二個使用者。

在流入口點(通道的上游)使用錯誤通道來處理故障。

備選地,添加ExpressionEvaluatingMessageHandlerAdvice到ftp適配器和添加對success通道JDBC適配器流動並在failure信道不同的更新流程。

+0

是否有任何非xml示例可供參考?我很難找到如何做你正在與訂單屬性建議。與表達式建議一樣,無法找到任何非xml示例來了解如何實現它。 – FiguringThisOut

+0

昨天我發佈了一個[Pull Request](https://github.com/spring-projects/spring-integration/pull/2021),並進行了一些改進(以及有關DSL配置的文檔)。在合併(並釋放)之前,您必須使用不同的'channel()'bean而不是通道名稱。訂單發送給消費者(如建議)。 –

+0

太好了,謝謝!我能夠弄清楚如何通過查看[行408-430](https://github.com/spring-projects/spring-integration/commit/3301da4157123264df1e0c7db2d4b3095edd7193#diff-bdb762ced0d512ecaa75eed504d7c64aR394)並通過頻道(而不是新添加的名稱方法)。 – FiguringThisOut

相關問題