1

Java DSL を使用して sfp アウトバウンド フローを構成しています。

ゲートウェイ:

@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() {
...
}

ゲートウェイが失敗したメッセージで応答するようにフローを構成するにはどうすればよいですか? 言い換えれば、無効ではなく、失敗したメッセージのリストをゲートウェイが返せるようにしたいのです。

@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 への接続がない) の場合、エラーは 1 つだけです (リストの最初のメッセージのペイロード)。すべてのメッセージを集約するためのアドバイスはどこに置くべきですか?

4

1 に答える 1

0

これは、Spring Integration Java DSL の問題ではありません。

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

Sftp.outboundAdapter()一方通行のどちらを使用しているため、応答がないため、現在は選択の余地がありません。そして、戻り値の型SftpGatewayでその動作の準備が整いました。void

ダウンストリームエラーがある場合は、それらをスローするか、キャッチしていくつかに送信することしかできませんerror-channel

あなたの要求によると:

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

依存していると言えます。実際には、ゲートウェイからのリターンです。そのため、空のリストをゲートウェイに返すと、エラーがないことを意味する場合があります。

Java は複数のリターン機能を提供しないため、ストリーム内でその単一のメッセージを構築して返すものを作成しない限り、選択の余地はありません。失敗したメッセージのリストを決定したので。

あなたはそこにいるので、単一の返信を作成するために.split()調べる必要があります..aggregate()

Aggregator は、 default を介して十分に簡単に Splitter と関連付けられますapplySequence = true

ExpressionEvaluatingRequestHandlerAdviceアグリゲーターに送信するには、Sftp.outboundAdapter()エンドポイント (の 2 番目のパラメーター)を調べることをお勧めします.handle()。これにより、良いメッセージと悪いメッセージの両方を同じ.aggregate()フローに送信する必要があります。結果リストを反復して、良い結果からクリーンアップすることができます。その後の結果は、SftpGatewayusingreplyChannelヘッダーに送信できます。

少し複雑に聞こえることは理解していますが、必要なものはそのままでは存在しません。何に到達できるかを理解するには、自分で考えて遊ぶ必要があります。

于 2016-09-14T13:28:22.157 に答える