2016-08-12 83 views
2

我有以下的Spring集成配置,它允許我從MVC控制器調用網關方法並讓控制器返回,而集成流程將在不阻塞控制器的單獨線程中自行繼續。在Spring集成流程異步處理異步

但是,我無法弄清楚如何讓我的錯誤處理程序爲這個異步流程工作。我的網關有錯誤通道定義,但我的例外由於某種原因不能達到它。相反,我看到LoggingHandler被調用。

@Bean 
IntegrationFlow mainInteractiveFlow() { 
    return IntegrationFlows.from(
      MessageChannels.executor("input", executor)) 
      .split() 
      .channel(MessageChannels.executor(executor)) 
      .transform(transformer) 
      .handle(genericMessageHandler, "validate") 
      .handle(genericMessageHandler, "checkSubscription") 
      .handle(interactiveMessageService, "handle") 
      .<Task, String>route(p -> p.getKind().name(), 
        m -> m.channelMapping(TaskKind.ABC.name(), "attachInteractiveChannel")) 
      .get(); 
} 

@Bean 
IntegrationFlow attachInteractiveChannelFlow() { 
    return IntegrationFlows.from(
      MessageChannels.direct("attachInteractiveChannel")) 
      .handle(issueRouterService) 
      .get(); 
} 

@Bean 
IntegrationFlow interactiveExceptionChannelFlow() { 
    return IntegrationFlows.from(interactiveExceptionChannel()) 
      .handle(errorHandler, "handleErrorMessage") 
      .get(); 
} 

@Bean 
MessageChannel interactiveExceptionChannel() { 
    return MessageChannels.direct("interactiveExceptionChannel").get(); 
} 

網關:

@MessagingGateway(errorChannel = "interactiveExceptionChannel") 
public interface InteractiveSlackGW { 

    @Gateway(requestChannel = "input") 
    void interactiveMessage(Collection<Request> messages); 

} 

我應該怎麼才能看到我的異常在異步集成流程發生在我的錯誤處理程序正在處理呢?

回答

2

帶有void return的網關無法回覆,因此沒有將回復/錯誤通道添加到郵件頭中。當在調用線程上運行時,異常將引發給調用者;在異步流程中,異常將轉至默認的errorChannel(附加了一個日誌適配器)。

對於這種情況,您需要添加一個頭豐富器以將errorChannel頭設置爲您的錯誤通道。

我們應該自動考慮這樣做,但它目前不會發生。我爲此打開了一個JIRA Issue

+0

哦,它解釋了一切。謝謝,加里。 –

+0

考慮類似'@GatewayHeader(name =「errorChannel」,expression =「@ interactiveExceptionChannel」)''。我認爲這個將在Spring Integration 5.0中完成。 –