我正在使用
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秒(没有在任何地方配置)。
答案 0 :(得分:1)
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()
看起来不可能。