Интеграция Spring MessagePublishingErrorHandler не вызывается
Я пытаюсь опубликовать свои исключения в определенном канале ошибки. Я использую 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;
}
ПОТОК с этого канала: -
@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 ответ
Проблема в том, что errorHandler
используется только с taskExecutor
в PublishSubscribeChannel
, В противном случае это просто игнорируется. Нам, вероятно, нужно WARN
по этому вопросу во время PublishSubscribeChannel
инициализация. Не стесняйтесь поднять JIRA по этому вопросу.
В качестве обходного пути вы можете сделать что-то вроде этого:
.publishSubscribeChannel(new SyncTaskExecutor(), config -> config
Таким образом, вы все еще в той же вызывающей теме, но Runnable.run()
будет действительно завернут в try...catch()
и ErrorMessage
будет опубликован на вашем appErrorChannel
,