有一条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我是否处理了异常并且它不应该再次回滚?
答案 0 :(得分:1)
IBM MQ正在按设计将消息重新发送给使用者。要在X次尝试后停止代理,请为IBM MQ配置“回退阈值”和“中断队列”,以便在传递尝试失败后将消息移出。