JMSセッションがトランザクション対応で、メッセージがロールバックされると、メッセージに JMSRedelivered が設定されます。ESB Muleをこのフラグで判定してメッセージを再送信するように設定できます。
JmsConnector
の maxRedelivery プロパティを設定すると再送信がされます。このプロパティは、コネクタにX 回、再送信させ、正常に送信できない場合は
MessageRedeliveredException
例外を投げます。その後に、このコネクタの例外処理を利用してメッセージを送達不能キュー(DLQ)に転送させることができます。
以下はActiveMQを利用したJmsConnectorの設定です。他JMSサーバの設定に付いてはJMSの設定を参照にしてください。
<connector name="JMSConnector" className="org.mule.providers.jms.JmsConnector">
<properties>
<property name="acknowledgeMode" value="1"/>
<property name="connectionFactoryJndiName" value="ConnectionFactory"/>
<property name="jndiInitialFactory"
value="org.codehaus.activemq.jndi.ActiveMQInitialContextFactory"/>
<property name="specification" value="1.1"/>
<property name="maxRedelivery" value="2"/>
</properties>
<exception-strategy className="org.mule.impl.DefaultExceptionStrategy">
<endpoint address="jms://DLQ">
<transaction action="JOIN_IF_POSSIBLE"/>
</endpoint>
</exception-strategy>
</connector>
上の設定は、メッセージを3回まで送信します。1回は初めてメッセージを送信する場合で、後の2回は正常に送信できなかった場合の再送信です。3回目で正常に送信が出来なかった場合は、コネクタの例外処理が実行されます。エンドポイントの例外処理に JOIN_IF_POSSIBLE を定義するトランザクション要素があることに注目してください。この設定は、ESB Muleに実行中のJMSトランザクションがある場合は、同じトランザクション内でDLQへ書き出すように指示をします。