2017-01-03 12 views
0

JdbcOutboundGatewayへのメッセージの送信を、FTPファイル転送が成功した場合にのみ行う方法を教えてください。Spring統合によるFTPファイルアップロード成功メッセージの送信

私は以下のIntegrationFlowを持っています。 FTPサーバーにファイルをアップロードしています。しかし、その後、ファイルが正常にアップロードされたことをDBに書き込むか、FTPアップロードで失敗した場合にレコードを更新する必要があります。私はファイル転送の成功のDB更新を開始する方法を考え出すのに困っています。どこでも私はフローを継続しようとしますが、それは単なる「一方向」であるという例外をスローします。

  • ftpPropsは
  • ftpSessionFactoryFactoryは値からすべての様々なFtpSessionFactoryオブジェクトを構築し、メッセージがFTPを介して送信することが必要に配置されているチャネルは、様々なFTPセットアップ
  • outboundMessagesのためのすべての設定値を含みます

    :ルータは、ヘッダ値

検査フローを通じてにメッセージを送信するかを決定することをconfigファイルに

@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アダプタを使用して2番目のフローをサブスクライブします。ルーターおよびjdbcアダプターのコンシューマーのorderプロパティーを正しい順序で呼び出されるように設定します。

デフォルトでは、最初のコンシューマが失敗した場合、2番目のコンシューマは呼び出されません。

フローエントリポイント(チャネルの上流)でエラーチャネルを使用して、障害を処理します。

また、ExpressionEvaluatingMessageHandlerAdviceをftpアダプタに追加し、successチャネルにJDBCアダプタフローを追加し、failureチャネルに異なる更新フローを追加します。

+0

リファレンスにはxml以外のサンプルがありますか?私はあなたがorderプロパティで示唆していることをする方法を見つけるのが難しいです。表現のアドバイスと同じですが、それを実装する方法を理解するための非xmlサンプルを見つけることができません。 – FiguringThisOut

+0

私は昨日、いくつかの改良点(およびDSLの設定に関するドキュメント)と共に[プルリクエスト](https://github.com/spring-projects/spring-integration/pull/2021)を発行しました。それがマージ(そして解放)されるまでは、チャンネル名ではなく別々の 'channel()' Beanを使う必要があります。注文は消費者に伝わります(アドバイスのように)。 –

+0

偉大な、ありがとう!私は[行408 - 430](https://github.com/spring-projects/spring-integration/commit/3301da4157123264df1e0c7db2d4b3095edd7193#diff-bdb762ced0d512ecaa75eed50d7c64aR394)を見て、それを設定する方法を理解することができた新しく追加された名前メソッドの代わりに)。 – FiguringThisOut

関連する問題