私はspring integration java dslを使用して電子メールを送信するサービスに取り組んでいます。ダイレクトチャネルを使用したメッセージスプリッタの後のエラー処理
私は電子メールに変換される個々のメッセージの集合に分割されたバッチメッセージを持っています。
これらの個々のメッセージのいずれかでエラーが発生した場合、そのバッチ内の他のメッセージは処理されません。
メッセージが例外をスローすると例外が正常に処理され、バッチ内の次のメッセージが処理されるようにフローを設定する方法はありますか?
次のコードは、私が望む機能を実現しますが、これを達成するためのより簡単な方法があれば理想的です。 :あなたは、そのtrapException
オプションで最後handle()
定義にExpressionEvaluatingRequestHandlerAdvice
を追加することができます
@Bean
public MessageChannel individualFlowInputChannel() {
return MessageChannels.direct().get();
}
@Bean
public IntegrationFlow batchFlow() {
return f -> f
.split()
.handle(message -> {
try {
individualFlowInputChannel().send(message);
} catch (Exception e) {
e.printStackTrace();
}
});
}
@Bean
public IntegrationFlow individualFlow() {
return IntegrationFlows.from(individualFlowInputChannel())
.handle((payload, headers) -> {
throw new RuntimeException("BOOM!");
}).get();
}
ありがとうございましたArtem。アドバイスは 'handle()'定義の権利にのみ適用されますか?私は下流のコンポーネントからの例外に対しても堅牢でありたいと思います。 私は 'ExecutorChannel'のアプローチがおそらく最良のアプローチであると私は同意します。将来的にそれを使うことを検討します。 – DMurphy
そうです、' ExpressionEvaluatingRequestHandlerAdvice'は実際には 'handleRequestMessage' - 現在の' AbstractReplyProducingMessageHandler'のスコープにのみ適用されます。すべての下流例外を "トラップ"したい場合は、独自の 'HandleMessageAdvice'を実装する必要があります。それ以外の場合は、同じスレッド内のすべての例外がスローされ、実際に次の分割アイテム処理が停止されます –