背景:
我们有一个用Spring XML配置编写的Spring Integration适配器,如下所示。它在错误处理的所有场景中都能很好地工作。所有这一切,错误处理都是将错误消息写入队列。现在我们需要将这个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;
}
答案 0 :(得分: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
bean,就像它在XML配置中一样。
并注意我Jms.messageDrivenChannelAdapter()
的使用方式 - 来自IntegrationFlows.from()
和get()
来电。
如果您要使用MessageDrivenChannelAdapter()
方法,则必须是public
和@Bean
,否则IntegrationComponentSpec
的所有内部都无法正常工作,因为它们在.get()
致电后丢失。