如何在Spring Integration Jms.inboundGateway中关闭自动重试

时间:2016-04-14 00:46:30

标签: spring-integration dsl spring-java-config

我正在使用 spring 4.2.4.RELEASEspring-integration-java-dsl:1.1.2.RELEASE

我有Jms.inboundGateway和一些变压器。当转换器失败转换邮件时,入站网关会一次又一次地重试。但是我想在异常的情况下停止整个流程。
有可能吗?

这是我的流程配置:

@Bean
public IntegrationFlow nonStop {
    return IntegrationFlows
            .from(Jms.inboundGateway(emsConnectionFactory)
                    .destination(myDestination)
                    .configureListenerContainer(spec -> spec
                            .sessionTransacted(true)
                            .subscriptionDurable(true)
                            .durableSubscriptionName(durableSubscriptionName)
                            .errorHandler((ErrorHandler) t -> {
                                t.printStackTrace();
                                throw new RuntimeException(t);
                            }))
                    .errorChannel(errorChannel)
                    .autoStartup(true)
                    .id(myNonStoppableFlow))
            .filter(...)
            .transform(...)
            .handle(Jms.outboundAdapter(emsConnectionFactory)
                             .destination(myOnotherDestination))
            .get();
}

一个有趣的通知。当errorHandler吞没异常入站网关退休时没有任何延迟。当它抛出运行时异常时,延迟大约5秒(没有在任何地方配置)。

1 个答案:

答案 0 :(得分:1)

JMS中的retry被称为redeliveryhttp://www.javaworld.com/article/2074123/java-web-development/transaction-and-redelivery-in-jms.html

因此,任何下游异常都会使您的消息回滚和重新传递,可以在Broker上为目标配置。

实际上,如果您的.errorChannel(errorChannel)流不会重新抛出异常,它将被视为successful处理和提交。

从另一方面来说,如果你真的需要Jms.inboundGateway(),你应该重新考虑。因为这个需要回复,最终您的Jms.outboundAdapter()看起来不可能。