2017-02-03 8 views
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に例外を処理したことを伝えることができます。また、それを再度ロールバックするべきではありませんか?

+0

トランザクションマネージャと接続ファクトリを含む完全なBeanセットアップを共有できますか?トランザクションマネージャへの配線は表示されません。また、あなたのルートはInOutであるべきですか?この設定は、着信メッセージにJMSReplyToヘッダーがある場合にのみ適用されます。 –

答えて

1

IBM MQは、設計上、メッセージをコンシューマに再送しています。 X回の試行後にブローカを停止させるには、失敗した配信試行後にメッセージを途中で移動させるためにIBM MQの「バックアウトしきい値」と「ブラックアウト・キュー」を構成します。

関連する問題