Spring集成MessagePublishingErrorHandler未被调用

时间:2018-05-17 12:19:34

标签: java spring spring-integration spring-integration-dsl

我正在尝试将我的例外发布到特定的错误频道。 我使用MessagePublishingErrorHandler作为相同的内容。

但是我的错误没有被发送到我创建的频道。

这是我的代码: -

信道: -

@Bean(value = "appErrorChannel")
    public PublishSubscribeChannel appErrorChannel() {
        return new PublishSubscribeChannel();
    }

的MessageHandler:

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

来自此频道的FLOW: -

@Bean
public IntegrationFlow errorFlow(@Qualifier("appErrorChannel") PublishSubscribeChannel errChannel) {
    return flow -> flow.channel(errChannel).
            publishSubscribeChannel(spec -> spec
                    .subscribe(f1 -> f1.handle(m -> System.out.println("******************* "+ m.getPayload()))));
}

我原来的频道。 act方法抛出异常: -

@Bean
    public IntegrationFlow pubSubFlow(PublishSubscribeChannel publishSubscribeChannel, 
                                      @Qualifier("myMessagePublishingErrorHandler")
            MessagePublishingErrorHandler messagePublishingErrorHandler) {
        return flow -> flow.channel(publishSubscribeChannel).split()
                .channel(new ExecutorSubscribableChannel(Executors.newFixedThreadPool(1)))
                .publishSubscribeChannel(config -> config
                .subscribe(f1 -> f1.handle("action", "act")
                        .handle(m1 -> {System.out.println(">>>"+m1);}))
                        .errorHandler(messagePublishingErrorHandler)
                );
    }

1 个答案:

答案 0 :(得分:1)

errorHandler仅与taskExecutor中的PublishSubscribeChannel一起使用的问题。否则它会被忽略。在WARN初始化期间,我们可能需要PublishSubscribeChannel处理此问题。随意就此事提出JIRA。

作为一种解决方法,您可以执行以下操作:

.publishSubscribeChannel(new SyncTaskExecutor(), config -> config

这样你仍然在同一个调用线程中,但Runnable.run()将真正包含在try...catch()中,ErrorMessage将发布到你的{{1} }}