ESB Muleトランザクション・フレームワークは下層で使われているトランザクション・マネージャに依存しています。トランザクションをJDBCトランザクション, XAトランザクション,JMSトランザクション又はメッセージの確認にすることができます。どのトランザクションでもESB Mule上では同じように処理されます。ESB Muleトランザクションは受信(inbound)エンドポイントに設定します。エンドポイントの設定により、新しいトランザクションを始めるか、既存のトランザクションに参加させることができます。送信(outbound)エンドポイントは既存のトランザクションと対象のリソースが同じであれば、自動的にそのトランザクションに参加します。
トランザクションは<transaction>タグを使ってエンドポイントに設定されます。transaction要素はorg.mule.umo.transaction.UMOTransactionConfigクラスと関連しています。エンドポイントがイベントを受信した場合や、トランザクション・ファクトリからトランザクションが生成された場合にどのように扱うかを<transaction>タグで定義します。
一つのリソースを使ったトランザクション
一つのリソースを使ったトランザクションとは、下層のリソースで提供されているトランザクションです:
JDBCトランザクション又はJMSトランザクション
これらのトランザクションは、一つのリソースのみを使ってメッセージの送信と受信を行います。
以下は受信(inbound)エンドポイントの設定例です:
<endpoint name="myInboundEndpoint" type="receiver" address="jms://test.In">
<transaction action="ALWAYS_BEGIN" factory="org.mule.providers.jms.JmsTransactionFactory" />
</endpoint>
上の設定は「test.out」キューを使ってメッセージを送信するJMSメッセージ・エンドポイントの定義です。ファクトリ(factory)属性はTransactionFactoryはの完全修飾パスです。ESB Muleはこのエンドポイント用のトランザクションを生成するのにその値を使います。action属性はESB Muleに各イベントをどのように処理するかを指示します。上の例の設定では、イベントを受信した度に新しいトランザクションを開始します。<tx-inbound>タグのaction属性に以下の値を設定できます:
- NONE - トランザクションに不参加。
- ALWAYS_BEGIN - イベント毎に新しいトランザクションを開始しる。既にトランザクションがある場合は例外が投げられます。
- BEGIN_OR_JOIN - イベントを受信した時に既にトランザクションがある場合は、それに参加する。以外の場合は新規にトランザクションを開始する。
- ALWAYS_JOIN - 既存のトランザクションに参加する。既存のトランザクションが無い場合は例外が投げられます。
- JOIN_IF_POSSIBLE - 既存のトランザクションがある場合は参加する。無い場合はトランザクションを作成しません。
送信(outbound)エンドポイントは特定した設定はありません:
<endpoint name="myOutboundEndpoint" type="sender" address="jms://test.Out" />
送信エンドポイントは、現在のトランザクションある場合は、そのトランザクションで利用されているリソースを使います。
この場合は、イベントを受信したJMSセッションを使います。受信(inbound)エンドポイントが送信(outbound)エンドポイントにメッセージを転送した場合に、トランザクションはコミット又はロールバックされます。
宛先リストルータを使って複数のメッセージを1つのトランザクションとして送ることができます。
XAトランザクション
複数の管理されたリソースを同じトランザクションで使う場合にはXAトランザクションを使います。
受信(inbound)エンドポイントは一つのリソースを使ったトランザクションを同じように設定します。ただし、コネクタをxa-enabledリソースを使うように設定をします。
ESB Muleをアプリケーション・サーバの外で実行している場合は、Jotmトランザクション・マネージャを使って組み込まれたトランザクション・マネージャを設定することができます。その他の設定方法に付いては次の節を参照してください。
XAトランザクションでは以下の3プロバイダのみを設定することができます:
XA設定の例
次の例は、1つのトランザクションでJMSキューから読み込んだデータをデータベースへ書き込みます。
<mule-descriptor name="JmsToJdbc" implementation="org.foo.MyComponent">
<inbound-router>
<endpoint address="jms://my.queue?reuseSession=false">
<transaction action="ALWAYS_BEGIN" factory="org.mule.transaction.XaTransactionFactory" timeout="60000"/>
</endpoint>
</inbound-router>
<outbound-router>
<router className="org.mule.routing.outbound.OutboundPassThroughRouter">
<endpoint address="jdbc://writeTest?type=2" />
</router>
</outbound-router>
</mule-descriptor>
受信JMSエンドポイント(inbound Jms endpoint)に XATransactionFactory が設定されているため、コンポーネントの送信エンドポイント(outbound endpoint)もXAトランザクションに参加されます。ただし、送信エンドポイントのトランスポートがXAトランザクションをサポートしていることを前提とします(XAトランザクションに対応したトランスポートの一覧は上の節に記述してます)。この設定を有効にするには、JMS XA Connection Factoryを使ってJMSコネクタを設定し、JDBCコネクタをXA DataSourceを使うように設定します。
トランザクション・マネージャのルックアップ
Unable to render {include} Couldn't find a page to include called: Transaction Manager Lookup
トランザクションの調整
トランザクションの境はエンドポイントで制御されます。トランザクションの実際の管理はESB Mule TransactionCoordinatorが行います。トランザクションの流れは全て同期で行われるようにします。TransactionCoordinatorはシングルトンのマネージャであり、ESB Muleインスタンスの全てのトランザクションを管理し、トランザクションのバインディング/アンバインディング用のメソッドを提供し、現在実行中のトランザクションの状態を取得します。