1

背景:

我们有一个用 Spring XML 配置编写的 Spring Integration 适配器,如下所示。它在错误处理的所有场景中都能完美运行。错误处理所做的所有事情就是将错误消息写入队列。现在我们需要将此 xml 配置转换为 DSL,我们已使用以下代码进行了更改。

问题:

每当'inputChannel'链中发生错误时,我们希望错误处理进行一些检查并将错误写入错误队列并且不要重试Payload。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;
}
4

1 回答 1

1

有一些问题:

  1. 你没有展示你如何使用它MessageDrivenChannelAdapter()

  2. 您应该共享 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();
}

要点是jmsContainerbean,因为它在您的 XML 配置中。

并注意我是如何使用Jms.messageDrivenChannelAdapter()的 - 从IntegrationFlows.from()和没有get()电话。

如果你要使用那个MessageDrivenChannelAdapter()方法,它必须是publicand @Bean,否则所有的内部IntegrationComponentSpec都不会工作,因为它们在.get()调用后会丢失。

于 2016-11-09T01:34:52.367 回答