Spring Integration MessagePublishingErrorHandler

Рейтинг: -1Ответов: 1Опубликовано: 13.07.2023

Всем привет!
Столкнулся с проблемой MessagePublishingErrorHandler. Немного не понимаю, все ли верно происходит в каналах и обработке.

Есть следующий bean:

@Bean
public IntegrationFlow compliteManualDealStatusFlow(CompleteDealStatusServise 
                                                              completeDealStatusService,
                                                    MessageChanel 
                                                          comleteManualDealStatusChannel, 
                                                    OutputManualModeServiseLogger 
                                                           outputManualModeServiseLogger, 
                                                    MessageChanel backtestDealChanel){                                                            
return IntegrationFlow
.from(completeDealStatusService)
.handel(completeDealStatusService)
.transform(outputManualModeServiseLogger)
.channel(backtestDealChanel)
.get();
}

Правильно ли я понимаю, как работает этот бин? Сначала из канала completeDealStatusService мы забираем сообщение/объект, далее в .handel(completeDealStatusService) передаем и что-то делаем в данном методе, далее с вернувшимся объектом в .transform(outputManualModeServiseLogger) и в итоге отправляем в канал backtestDealChanel?

Теперь мне нужно из этого бина отправить в еще один метод мой объект, и я изменяю код следующим образом:

    @Bean
public IntegrationFlow compliteManualDealStatusFlow(CompleteDealStatusServise 
                                                              completeDealStatusService,
                                                    MessageChanel 
                                                          comleteManualDealStatusChannel, 
                                                    OutputManualModeServiseLogger 
                                                           outputManualModeServiseLogger, 
                                                    MessageChanel backtestDealChanel, 
                                                          CloningService cloningService){
return IntegrationFlow
.from(completeDealStatusService)
.handel(completeDealStatusService)
.handel(cloningService, "sendManualDeal")
.transform(outputManualModeServiseLogger)
.channel(backtestDealChanel)
.get();
}

В логах после этого я получаю ошибку MessagePublishingErrorHandler. Что я могу делать не так? В свяжи с чем происходит данная ошибка? Влияет ли расположение методов на данную ошибку?

введите сюда описание изображения

Ответы

▲ 0

Хорошо быд бы увидеть полный stacktrace ошибки, но виглядит так, что требование посылать рузультат .handel(completeDealStatusService) в .handel(cloningService, "sendManualDeal") и .transform(outputManualModeServiseLogger). Для этого рекомендуется использовать publishSubscribeChannel(Consumer<PublishSubscribeSpec> publishSubscribeChannelConfigurer):

.handel(completeDealStatusService)
.publishSubscribeChannel(pubSub - > pubSub.subscribe(subFlow -> subFlow..handel(cloningService, "sendManualDeal")))
.transform(outputManualModeServiseLogger)
.channel(backtestDealChanel)

Таким образом будет два подпищика на этот канал: врутренний subscribe() и следующий transform().

Документация здесь: https://docs.spring.io/spring-integration/docs/current/reference/html/dsl.html#java-dsl-subflows

Если это не так, то дай, пожалуйста, больше информации о требованиях и об ошибке.

P.S.: Я предпочитаю отвечать на такие вопросы на английском.