我正在使用spring 4.2.4.RELEASE
和spring-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()
时是不可能的。