1
camelルートがあり、処理され、例外はTransactionErrorHandler
によって処理されます。コードは次のようになります。ラクダルートでMQトランザクションをコミットする方法は?
...
<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 ...
を、その後メッセージが再度入力キューに置かれ、トランザクションがから始まります開始(無限ループ)。
私たちはIBM MQを使用しています。このロールバックは、ラクダのルートではなくMQによって実行されると思います。つまり、問題は次のとおりです。MQに例外を処理したことを伝えることができます。また、それを再度ロールバックするべきではありませんか?
トランザクションマネージャと接続ファクトリを含む完全なBeanセットアップを共有できますか?トランザクションマネージャへの配線は表示されません。また、あなたのルートはInOutであるべきですか?この設定は、着信メッセージにJMSReplyToヘッダーがある場合にのみ適用されます。 –