如何在驼峰路由中提交MQ事务?

时间:2017-02-03 00:24:19

标签: apache-camel ibm-mq mq jbossfuse

有一条camel路由,该路由经过交易,异常由TransactionErrorHandler处理。代码看起来像这样:

...
<bean
    id="errorHandler"
    class="org.apache.camel.spring.spi.TransactionErrorHandlerBuilder">
</bean>
...
<camelContext errorHandlerRef="errorHandler">
    ...
    <onException>
        <exception>java.lang.Exception</exception>
        <handled>
            <constant>true</constant>
        </handled>
        <!-- do some exception handling -->
    </onException>

    <route>
        <from uri="mq:queue://QMgr/Q?exchangePattern=InOut" />
        <transacted />
        <!-- some routing that throws an Exception -->
    </route>
</camelContext>

它有效并且在处理错误之后有一个事务提交:Transaction commit (0xfab75a3a) redelivered(true) for ...,但随后消息再次放入输入队列,事务从头开始(无限循环)。 / p>

我们正在使用IBM MQ,我认为这次回滚是由MQ执行的,而不是来自camel路由。所以问题是:我可以告诉MQ我是否处理了异常并且它不应该再次回滚?

1 个答案:

答案 0 :(得分:1)

IBM MQ正在按设计将消息重新发送给使用者。要在X次尝试后停止代理,请为IBM MQ配置“回退阈值”和“中断队列”,以便在传递尝试失败后将消息移出。