2016-08-15 9 views
1

Spring Integration Java DSLのexecutorチャネルのエラーを処理する呼び出し元のみを制限する方法を知りたいと思います。Spring統合におけるExecutorChannelのエラーチャネルの処理方法Java DSL

呼び出し側がイベントを送信するためにqueue(入力を抑制するサイズ100)があり、ポーラーがキューをポーリングして非同期処理のためにExecutorChannelに送信しますタスク実行プログラムのプールサイズを2に制限します)。非同期処理の結果は、呼び出し側に返されます。また、非同期処理のために例外がスローされる場合もあります。元の呼び出し元は、グローバルエラーハンドラで処理するのではなく、例外を処理します。

私は、発信者だけがExecutorChannelからスローされたエラーを見ることができ、それをSpring Integration Java DSLのプライベートな方法で処理できるチャンネルを指定する方法を知らない。

答えて

0

そのためには、MessageChannelにはerrorChannelというヘッダーを指定する必要があります。これは発信者のものとまったく同じです。 failedMessage.getHeaders().getErrorChannel()との一部に

private MessageChannel resolveErrorChannel(Throwable t) { 
    Message<?> failedMessage = (t instanceof MessagingException) ? 
      ((MessagingException) t).getFailedMessage() : null; 
    if (this.defaultErrorChannel == null && this.channelResolver != null) { 
     this.defaultErrorChannel = this.channelResolver.resolveDestination(
       IntegrationContextUtils.ERROR_CHANNEL_BEAN_NAME); 
    } 

    if (failedMessage == null || failedMessage.getHeaders().getErrorChannel() == null) { 
     return this.defaultErrorChannel; 
    } 
    Object errorChannelHeader = failedMessage.getHeaders().getErrorChannel(); 
    if (errorChannelHeader instanceof MessageChannel) { 
     return (MessageChannel) errorChannelHeader; 
    } 
    Assert.isInstanceOf(String.class, errorChannelHeader, 
      "Unsupported error channel header type. Expected MessageChannel or String, but actual type is [" + 
      errorChannelHeader.getClass() + "]"); 
    return this.channelResolver.resolveDestination((String) errorChannelHeader); 
} 

ご注意:

ExecutorChannel

は、次のようなコードを持っている MessagePublishingErrorHandlerに基づいています。

@MessagingGatewayerrorChannelオプションのすぐれたソリューションです。これはまったく同じerrorChannelヘッダーテクニックを使用し、その例外の範囲内で正確に例外を処理または再スローさせます。@MessagingGateway

関連する問題