Spring集成流异步中的错误处理

时间:2016-08-12 07:10:38

标签: java spring-integration

我有以下Spring Integration配置,允许我从MVC Controller调用一个网关方法并让控制器返回,而集成流将在一个不阻塞控制器的单独线程中自行继续。

但是,我无法弄清楚如何使我的错误处理程序适用于此异步流程。我的网关定义了错误通道,但由于某些原因,我的异常没有达到它。相反,我看到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);

}

我应该怎么做才能看到我的错误处理程序正在处理异步集成流程中发生的异常?

1 个答案:

答案 0 :(得分:2)

具有void返回的网关不需要回复,因此没有回复/错误通道添加到邮件头。在调用线程上运行时,会向调用者抛出异常;对于异步流,异常将转到默认errorChannel(附加了日志适配器)。

对于这种情况,您需要添加标头扩充器以将errorChannel标头设置为错误通道。

我们应该自动调查,但目前不会发生。

我为此打开了JIRA Issue