2016-08-15 101 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的範圍內。