Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache camel 如何为订单处理(EOIO)配置camel/spring JMS?_Apache Camel_Spring Jms_Oracle Aq - Fatal编程技术网

Apache camel 如何为订单处理(EOIO)配置camel/spring JMS?

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"/> <

我正试图实现对JMS消息的一次顺序处理(从Oracle高级队列中使用,但这不重要)

出于测试目的,我创建了以下路线:

    <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%,因为这可能会导致在没有足够延迟的订阅者上进行大量失败的尝试)。您可以将重新交付策略设置为无限期重试,并使用(上限)指数退避以避免以不必要的高频率重新尝试。