Java 异常后未发出Spring集成消息

Java 异常后未发出Spring集成消息,java,spring,exception-handling,spring-integration,Java,Spring,Exception Handling,Spring Integration,我尝试处理spring集成流中发生的异常 流程如下: 源->拆分->句柄->句柄 我的源代码提供了一个对象列表作为有效负载。 拆分一次发射一个元素 第一个处理程序遇到异常。 我希望由于异常被发布到下面示例中配置的错误通道,列表中的其他元素将继续被发出。 但是在第一个异常之后,流停止!!! 是否有我缺少的配置 @Bean public IntegrationFlow pubSubFlow(PublishSubscribeChannel publishSubscribeChannel

我尝试处理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));
    }

我对您的
pubSubFlow
代码进行了一些重构,以修复错误并使其更具可读性。请在今后考虑尊重我们的努力,以帮助您使问题尽可能干净。< / P> 因此,您的代码没有反映描述。您在每个pub分支机构中都有
.split()
,而不是在主流中

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

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

但是,请注意,
messagePublishingErrorHandler
将在
PublishSubscribeChannel
上工作,如果它配置了
执行器


无论如何,总是有办法在拆分器后面放置一个执行器通道,以并行处理项目,并且不会因为错误而影响主拆分循环。

感谢您在这方面花费时间。我真的很感谢你的帮助。我现在使用执行者频道,我得到了想要的行为。将其标记为答案!!!
@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();
    }