2017-10-03 2 views
1

私は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(); 
    } 

答えて

0

:あなたは、「メールを送信」について話している場合一方

/** 
* If true, any exception will be caught and null returned. 
* Default false. 
* @param trapException true to trap Exceptions. 
*/ 
public void setTrapException(boolean trapException) { 

、それは良いことではないでしょう分割されたアイテムごとに別々のスレッドでこれを行うことを検討しますか?この場合、.split()の後にExecutorChannelが救助に来ます!

+1

ありがとうございましたArtem。アドバイスは 'handle()'定義の権利にのみ適用されますか?私は下流のコンポーネントからの例外に対しても堅牢でありたいと思います。 私は 'ExecutorChannel'のアプローチがおそらく最良のアプローチであると私は同意します。将来的にそれを使うことを検討します。 – DMurphy

+0

そうです、' ExpressionEvaluatingRequestHandlerAdvice'は実際には 'handleRequestMessage' - 現在の' AbstractReplyProducingMessageHandler'のスコープにのみ適用されます。すべての下流例外を "トラップ"したい場合は、独自の 'HandleMessageAdvice'を実装する必要があります。それ以外の場合は、同じスレッド内のすべての例外がスローされ、実際に次の分割アイテム処理が停止されます –

関連する問題