【问题标题】:Spring integration MessagePublishingErrorHandler not being invoked未调用 Spring 集成 MessagePublishingErrorHandler
【发布时间】:2018-05-17 12:19:34
【问题描述】:

我正在尝试将我的异常发布到特定的错误通道。 我也使用MessagePublishingErrorHandler

但是我的错误没有被路由到我创建的频道。

这是我的代码:-

频道:-

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

消息处理程序:

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

来自这个频道的流量:-

@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)
                );
    }

【问题讨论】:

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


    【解决方案1】:

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

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

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

    这样你仍然在同一个调用线程中,但Runnable.run() 将被真正包装到try...catch() 并且ErrorMessage 将被发布到你的appErrorChannel

    【讨论】:

    • 我自动装配了一个 TaskExecutor 实例,它可以工作,谢谢。
    猜你喜欢
    • 2017-06-12
    • 1970-01-01
    • 2014-02-20
    • 2012-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-09
    相关资源
    最近更新 更多