Интеграция 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,

Другие вопросы по тегам