错误处理程序处理

时间:2016-11-08 22:46:53

标签: spring-integration spring-dsl

背景:

我们有一个用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;
}

1 个答案:

答案 0 :(得分:1)

有一些问题:

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

  2. 您应该共享DEBUG日志,以演示消息应该如何传播以及如何传播。

  3. 如果我是你,我会将该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()致电后丢失。