java - Spring 集成 MessagePublishingErrorHandler 未被调用

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

我正在尝试将异常发布到特定的错误 channel 。 我使用 MessagePublishingErrorHandler 来实现相同的目的。

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

这是我的代码:-

channel :-

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

来自该 channel 的流量:-

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

我的原始 channel 。 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)
                );
    }

最佳答案

errorHandler仅与PublishSubscribeChannel中的taskExecutor一起使用的问题。否则它就会被忽略。我们可能需要在 PublishSubscribeChannel 初始化期间就此事发出警告。欢迎就此事提出 JIRA。

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

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

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

关于java - Spring 集成 MessagePublishingErrorHandler 未被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50391320/

相关文章:

java - 配置其他库以在 JSP (Tomcat) 中使用

javax.swing.Timer 与 java.util.Timer

java - 添加validation-api-2.0.1.final.jar会出现错误

java - Spring http出站网关希望使用PollableChannel而不是DirectChannel

java - Spring 集成: File Reading Splitting and Message Filtering

java - WatchEventType.DELETE 似乎不起作用

java - 在 spring-boot 项目中使用 spring mvc xml 项目

java - Bean 验证 (JSR-303) 错误未使用 Spring DATA REST 序列化

java - 支持为 Spring Cloud Stream 绑定(bind)中的每个消费者绑定(bind)定义 spring.json.key.type

java - ConcurrentMap.remove() 是否在 get() 返回 null 之前提供先行边?