2016-09-14 17 views
1

sfp送信フローを設定するには、java dslを使用しています。sftp応答チャネルを作成して、エラーメッセージを返信します。

ゲートウェイ:

@MessagingGateway 
public interface SftpGateway { 
@Gateway(requestChannel = "sftp-channel") 
void sendFiles(List<Message> messages); 
} 

設定:

@Bean 
public IntegrationFlow sftpFlow(DefaultSftpSessionFactory sftpSessionFactory) { 
    return IntegrationFlows 
      .from("sftp-channel") 
      .split() 
      .handle(Sftp.outboundAdapter(sftpSessionFactory, FileExistsMode.REPLACE) 
      .useTemporaryFileName(false) 
      .remoteDirectory(REMOTE_DIR_TO_CREATE).autoCreateDirectory(true)).get(); 
} 

@Bean 
public DefaultSftpSessionFactory sftpSessionFactory() { 
... 
} 

私は私のゲートウェイが失敗したメッセージに返信するためにフローを設定するにはどうすればよいですか? 言い換えれば、私のゲートウェイは、無効ではなく失敗したメッセージのリストを返すことができるようにしたい。

私は私が唯一の1を取得し @MessagingGateway(errorChannel = "errorChannel")

とゲートウェイをマークし、エラーチャネル

@Bean 
public IntegrationFlow errorFlow() { 
    return IntegrationFlows.from("errorChannel").handle(new GenericHandler<MessagingException>() { 

     public Message handle(MessagingException payload, Map headers) { 
      System.out.println(payload.getFailedMessage().getHeaders()); 
      return payload.getFailedMessage(); 
     } 
    }) 
      .get(); 
} 

@Bean 
public MessageChannel errorChannel() { 
    return MessageChannels.direct().get(); 
} 

といくつかのエラーの場合は(つまり、SFTPへの接続なし)を書きましたエラー(リスト内の最初のメッセージのペイロード)。 アドバイスを入れてすべてのメッセージを集計する必要はありますか?

答えて

0

これはSpring Integration Java DSLには問題ありません。

これは主に設計およびアーキテクチャのタスクです。

現在のところ、一方向のSftp.outboundAdapter()を使用しているため、返信はありませんので、選択はありません。そして、あなたのSftpGatewayvoidの戻り値の型でその動作の準備が整いました。

ダウンストリームエラーがある場合は、スローするか、キャッチしてerror-channelに送信してください。

のあなたの要求によると:

私は私のゲートウェイが無効ではなく、失敗したメッセージのリストを返すことができるようにしたいです。

私はそれが依存していると思います。実際にはあなたのゲートウェイからの返却です。したがって、ゲートウェイに空のリストを返すと、エラーがない可能性があります。

Javaはマルチリターン機能を提供しないため、返す単一のメッセージを作成するストリームで何かを行わない限り、選択肢はありません。私たちは失敗したメッセージのリストを決めました。

.split()があるので、.aggregate()を調べて返信を1回作成する必要があります。

アグリゲータは、デフォルトでapplySequence = true経由でスプリッタと十分に簡単に対応します。

アグリゲータに送信する場合は、 .handle()Sftp.outboundAdapter()ExpressionEvaluatingRequestHandlerAdviceを調べることをおすすめします。これで、良いメッセージと悪いメッセージの両方を同じ.aggregate()フローに送信する必要があります。あなたは良い結果からそれを整理するために結果リストを反復することができます。それ以降の結果はreplyChannelヘッダーを使用してSftpGatewayに送信できます。

私はそれが少し複雑に聞こえることを理解しますが、あなたが望むものはすぐに存在しません。何が達成できるかを理解するために自分自身を考え、遊ぶ必要があります。

+0

アルテム、ご返信ありがとうございます! ExpressionEvaluatingRequestHandlerAdviceの例をいくつか教えてください。 – arctg

+0

私は自分の質問を編集しました。 – arctg

+0

このようなカスタムロジックには 'errorChannel'を使うのは良いことではありません。これはグローバルで、多くの他の非同期コンポーネントでデフォルトのエラーチャネルとして使用されています。http://docs.spring.io/spring-integration/reference/html/configuration.html#namespace-errorhandler –

関連する問題