Apache camel 如何为订单处理(EOIO)配置camel/spring JMS?
我正试图实现对JMS消息的一次顺序处理(从Oracle高级队列中使用,但这不重要) 出于测试目的,我创建了以下路线:Apache camel 如何为订单处理(EOIO)配置camel/spring JMS?,apache-camel,spring-jms,oracle-aq,Apache Camel,Spring Jms,Oracle Aq,我正试图实现对JMS消息的一次顺序处理(从Oracle高级队列中使用,但这不重要) 出于测试目的,我创建了以下路线: <route id="inputAqTest12"> <from id="_fromAqTest12" uri="aqTest12:queue:QUEPOSTDATA?transacted=true"/> <transacted id="_transactedAqTest12"/> <
<route id="inputAqTest12">
<from id="_fromAqTest12" uri="aqTest12:queue:QUEPOSTDATA?transacted=true"/>
<transacted id="_transactedAqTest12"/>
<!-- Simulate exceptions! -->
<when id="_when1">
<simple>${random(10)} == 0</simple>
<throwException exceptionType="java.lang.Exception"
id="_throwException1" message="Random error!"/>
</when>
<to .../>
</route>
${random(10)}==0
只要将我的Oracle队列配置为立即重新传递被拒绝的邮件,这项功能就可以正常工作。但我希望重试延迟大于零,以便消息能够在后端系统中断的情况下存活几分钟,而不会出现“无休止”的失败尝试
因此,我要寻找的是在事务回滚的情况下延迟检索下一条消息的可能性。我发现spring DefaultMessageListenerContainer有一个WaitBeforeRecoveryAttent()方法,如果消息处理失败()就会调用该方法。但不幸的是,这只发生在连续第二次失败之后;我想我需要在第一次回滚后就已经有延迟,这样我就可以通过将jms使用者回滚后的延迟配置为(例如)10秒,而将oracle高级队列的重试延迟配置为较低的值(例如,5秒)来获得EOIO
也许我也走错了路——所以欢迎任何关于如何为spring/camel JMS消费者实现EOIO行为的想法。提前感谢您的支持 除了立即使路由和事务失败之外,您还不能使用配置充分的驼峰错误处理程序吗?嗨,拉尔夫,谢谢您的评论,这肯定会以某种方式导致所需的行为,但仍然存在一个问题,即如果目标系统不可用,那么在某个时候重新交付也会失败——如果发生这种情况,那么事件就不正常了——或者我错过了什么?当然,我可以将Oracle配置为立即重新交付,并在重新交付策略出现错误时延迟处理(我认为这是可行的方法;但这仍然不是我想要的100%,因为这可能会导致在没有足够延迟的订阅者上进行大量失败的尝试)。您可以将重新交付策略设置为无限期重试,并使用(上限)指数退避以避免以不必要的高频率重新尝试。