2016-08-15 99 views
1

我想知道如何限制调用者处理Spring Integration Java DSL中执行程序通道的错误。如何处理Spring集成中的ExecutorChannel错误通道Java DSL

例如 在我的使用案例中,我有一个调用者发送事件的queue(大小为100来限制输入),轮询器将轮询队列并发送到ExecutorChannel以进行异步处理(假定处理是CPU密集型的并且我们将任务执行程序的池大小限制为2)。异步处理的结果将发回给调用者。此外,如果有异常抛出异步处理。原来的调用者将处理异常,而不是让全局错误处理程序来处理它。

我不知道如何指定一个通道,只有调用者可以看到从ExecutorChannel抛出的错误,并在Spring Integration Java DSL中以私有方式处理它。

回答

0

为此目的,您必须指定errorChannel标头,其中MessageChannel与您的调用者完全相同。

ExecutorChannel是基于其具有类似的代码MessagePublishingErrorHandler

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); 
} 

注重与failedMessage.getHeaders().getErrorChannel()的一部分。

您的开箱即用解决方案是@MessagingGatewayerrorChannel选件。这个使用完全相同的errorChannel标题技术,让我们处理或重新抛出异常,恰好在@MessagingGateway的范围内。