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



我正在使用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秒的延迟(在任何地方都没有配置)。

JMS中的retry的调用类似于redelivery:http://www.javaworld.com/article/2074123/java-web-development/transaction-and-redelivery-in-jms.html.

因此,任何下游异常都会导致消息回滚和重新传递,这可以在Broker上为目标进行配置。

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

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

最新更新