【问题标题】:Spring integration message not emitted after exception异常后未发出 Spring 集成消息
【发布时间】:2018-04-03 14:36:34
【问题描述】:

我尝试处理 Spring 集成流程中发生的异常。

流程如下:

源 -> 拆分 -> 句柄 -> 句柄

我的来源提供了一个对象列表作为有效负载。 拆分一次发出一个元素。

第一个处理程序遇到异常。 我期待由于异常被发布到下面示例中配置的错误通道,列表中的其他元素将继续发出。 但是在第一个异常之后,流程停止了!!! 有没有我遗漏的配置?

    @Bean
    public IntegrationFlow pubSubFlow(PublishSubscribeChannel publishSubscribeChannel,
            @Qualifier("myMessagePublishingErrorHandler") MessagePublishingErrorHandler messagePublishingErrorHandler) {

        return flow -> flow
                .channel(publishSubscribeChannel)
                .publishSubscribeChannel(config -> config
                        .subscribe(f1 -> f1
                                .split()
                                .handle("action", "act")
                                .handle(m1 -> System.out.println(">>>" + m1)))
                        .subscribe(f1 -> f1
                                .split()
                                .handle(m1 -> System.out.println("<<<" + m1)))
                        .errorHandler(messagePublishingErrorHandler));
    }

错误处理程序:

@Bean
    public MessagePublishingErrorHandler myMessagePublishingErrorHandler(@Qualifier("appErrorChannel") DirectChannel directChannel) {
        MessagePublishingErrorHandler messagePublishingErrorHandler = new MessagePublishingErrorHandler();
        messagePublishingErrorHandler.setDefaultErrorChannel(directChannel);
        return messagePublishingErrorHandler;
    }

    @Bean
    public DirectChannel appErrorChannel() {
        return new DirectChannel();
    }
    @Bean
    public IntegrationFlow errorFlow(@Qualifier("appErrorChannel") DirectChannel directChannel) {
        return IntegrationFlows.from(directChannel).handle(System.out::println).get();
    }

【问题讨论】:

    标签: java spring exception-handling spring-integration


    【解决方案1】:

    我稍微重构了您的 pubSubFlow 代码以修复错误并使其更具可读性。请考虑在未来尊重我们为帮助您尽可能清楚问题所做的努力。

    因此,您的代码没有反映描述。您在每个 pub-sub 分支中都有 .split(),而不是您可能希望的主流中。

    您在publishSubscribeChannel 上有一个messagePublishingErrorHandler,因此,确实在那里处理了任何下游错误,但这是针对发送到该子流的消息完成的。由于拆分器是该子流的一部分(对于一个传入消息),它肯定会停止工作,因为它刚刚冒泡了一个错误。

    请重新考虑您想要从流程中得到什么。如果你只需要拆分一次然后发布订阅,那么移动.split() 之前 publishSubscribeChannel()

    但是请注意,如果PublishSubscribeChannel 配置了ExecutormessagePublishingErrorHandler 将适用于PublishSubscribeChannel

    无论如何,总有办法在拆分器之后放置 ExecutorChannel 以并行处理项目,并且不会因错误影响主拆分循环。

    【讨论】:

    • 感谢 Artem 抽出宝贵时间。非常感谢您的帮助。我现在使用 ExecutorChannel 并获得了所需的行为。将其标记为答案!!!
    猜你喜欢
    • 2012-07-23
    • 2012-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多