2016-08-15 4 views
1

호출자 만 Spring Integration Java DSL의 실행자 채널에 대한 오류를 처리하는 방법을 알고 싶습니다.Spring 통합에서 ExecutorChannel의 오류 채널을 처리하는 방법 Java DSL

호출자가 이벤트를 보내도록 queue (입력을 스로틀하기 위해 100의 크기를 가짐)이 있고, 폴러가 대기열을 폴링하여 비동기 처리를 위해 ExecutorChannel으로 전송합니다 (처리가 CPU 집중적 인 것으로 가정하고 작업 실행자의 풀 크기를 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의 범위에서 예외를 처리하거나 다시 던지게합니다.