Spring 未调用集成 MessagePublishingErrorHandler
Spring integration MessagePublishingErrorHandler not being invoked
我正在尝试将我的异常发布到特定的错误通道。
我使用 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)
);
}
errorHandler
只能与PublishSubscribeChannel
中的taskExecutor
一起使用的问题。否则它只是被忽略。我们可能需要在 PublishSubscribeChannel
初始化期间对此事进行 WARN
处理。随时就此事提出 JIRA。
作为变通方法,您可以这样做:
.publishSubscribeChannel(new SyncTaskExecutor(), config -> config
这样你仍然在同一个调用线程中,但是 Runnable.run()
将真正包装到 try...catch()
并且 ErrorMessage
将被发布到你的 appErrorChannel
.
我正在尝试将我的异常发布到特定的错误通道。
我使用 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)
);
}
errorHandler
只能与PublishSubscribeChannel
中的taskExecutor
一起使用的问题。否则它只是被忽略。我们可能需要在 PublishSubscribeChannel
初始化期间对此事进行 WARN
处理。随时就此事提出 JIRA。
作为变通方法,您可以这样做:
.publishSubscribeChannel(new SyncTaskExecutor(), config -> config
这样你仍然在同一个调用线程中,但是 Runnable.run()
将真正包装到 try...catch()
并且 ErrorMessage
将被发布到你的 appErrorChannel
.