Spring Integration DSL JmsMessageDrivenChannelAdapter бесконечная повторная попытка после обработки обработчиком ошибок
Фон:
У нас есть адаптер Spring Integration, написанный на Spring XML config, как показано ниже. Он отлично работает во всех сценариях обработки ошибок. Все, что делает обработка ошибок, это записывает сообщение об ошибке в очередь. Теперь нам нужно преобразовать эту конфигурацию xml в DSL, мы изменили ее, используя приведенный ниже код.
Проблема:
Всякий раз, когда происходит ошибка внутри цепочки 'inputChannel', мы хотели, чтобы обработка ошибок выполняла некоторую проверку и записывала ошибку в очередь ошибок, а не повторяла полезную нагрузку. Spring XML делает именно то, что нужно, но когда мы изменяем его на DSL после помещения сообщения об ошибке в очередь ошибок, полезная нагрузка записывается обратно во входную очередь, и сообщение об ошибке из очереди исчезает, и это происходит в цикле, который никогда не заканчивается,
Анализ мы сделали:
После записи сообщения об ошибке в очередь ошибок не возникает никаких ошибок, и в конфигурации адаптера DSL ничего не обрабатывается.
Любая помощь / направление, чтобы решить это очень ценится.
Работающий Spring XML адаптер:
<int-jms:message-driven-channel-adapter
channel="inputChannel" container="jmsContainer" extract-payload="true" />
<beans:bean id="jmsContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
<beans:property name="connectionFactory" ref="connectionFactory" />
<beans:property name="destinationName" value="Queue.test" />
<beans:property name="errorHandler" ref="errorHandler" />
</beans:bean>
Проблемный адаптер в DSL:
private JmsMessageDrivenChannelAdapter MessageDrivenChannelAdapter(
String destinationName, String key) throws Exception {
JmsMessageDrivenChannelAdapter channelAdapter = Jms
.messageDriverChannelAdapter(connectionFactory)
.outputChannel(inputChannel)
.configureListenerContainer(
c -> c.errorHandler(errorHandler))
.destination(destinationName)
.setHeaderMapper(new HeaderMapper(getChannelHeaders(key)))
.get();
return channelAdapter;
}
1 ответ
Есть несколько вопросов:
Вы не показываете, как вы используете это
MessageDrivenChannelAdapter()
,Вы должны поделиться журналами DEBUG, чтобы продемонстрировать, как сообщения должны путешествовать и как нет.
На вашем месте я бы преобразовал этот XML в этот Java DSL:
@Bean
public DefaultMessageListenerContainer jmsContainer() {
DefaultMessageListenerContainer container = new DefaultMessageListenerContainer();
container.setConnectionFactory(jmsConnectionFactory());
container.setDestinationName("Queue.test");
container.setErrorHandler(errorHandler);
return container;
}
@Bean
public IntegrationFlow myJmsFlow() {
return IntegrationFlows.from(
Jms.messageDrivenChannelAdapter(jmsContainer())
.extractPayload(true))
.channel(inputChannel)
.get();
}
Главное, что есть jmsContainer
боб, как это в вашей конфигурации XML.
И обратите внимание, как я использую Jms.messageDrivenChannelAdapter()
- от IntegrationFlows.from()
и без get()
вызов.
Если вы собираетесь использовать это MessageDrivenChannelAdapter()
метод, это должно быть public
а также @Bean
в противном случае все внутренности IntegrationComponentSpec
не собираются работать, потому что они потеряли после .get()
вызов.