Интеграция Spring MessagePublishingErrorHandler не вызывается - PullRequest
0 голосов
/ 17 мая 2018

Я пытаюсь опубликовать свои исключения в определенном канале ошибки.Я использую 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;
    }

FLow с этого канала: -

@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 Ответ

0 голосов
/ 17 мая 2018

Проблема в том, что errorHandler используется только с taskExecutor в PublishSubscribeChannel.В противном случае это просто игнорируется.Нам, вероятно, нужно WARN по этому вопросу во время PublishSubscribeChannel инициализации.Не стесняйтесь поднимать JIRA по этому вопросу.

В качестве обходного пути вы можете сделать что-то вроде этого:

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

Таким образом, вы все еще в той же вызывающей ветке, но Runnable.run()будет действительно упакован в try...catch(), а ErrorMessage будет опубликован в вашем appErrorChannel.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...