Oracle® Fusion Middleware Oracle WebLogic Server JTAのプログラミング 11g リリース1 (10.3.6) B61631-05 |
|
![]() 前 |
![]() 次 |
この章では、WebLogic Serverが、サード・パーティ・システム(外部トランザクション・マネージャと呼ばれる)が調整する分散トランザクションに参加する方法を説明します。WebLogic Serverの処理は、外部トランザクションの処理の一部として行われます。外部トランザクション・マネージャは、コミット処理の一部としてWebLogic Serverのトランザクション・マネージャを駆動します。これを、WebLogic Serverへのトランザクションの「インポート」と言います。
以下の節では、外部管理トランザクションの構成および外部管理トランザクションへの参加のプロセスについて説明します。
WebLogic Serverのトランザクション・マネージャは、weblogic.transaction.InterposedTransactionManager
インタフェースを通じて、javax.transaction.xa.XAResource
実装を公開します。外部トランザクション・マネージャは、InterposedTransactionManager
インタフェースにアクセスして、コミット処理時にWebLogic Serverトランザクション・マネージャのXAResourceを調整することができます。
外部トランザクション・マネージャのトランザクションをWebLogic Serverのトランザクション・マネージャにインポートする場合には、外部トランザクション・マネージャに従属マネージャとして、WebLogic Server介在トランザクション・マネージャを登録する必要があります。その結果、WebLogic Serverのトランザクション・マネージャは、インポートされたトランザクションの調整役としてWebLogic Server内で機能します。
WebLogic Serverでは、トランザクションのインポートに関して、次の2つの構成方式がサポートされています。
クライアント介在トランザクション・マネージャを使用する、WebLogic Serverに外部的に実装されたクライアント側ゲートウェイの使用
サーバー介在トランザクション・マネージャを使用する、WebLogic Serverインスタンスに実装されたサーバー側ゲートウェイの使用
実装の詳細および制限に関してはいくつかの違いがありますが、どちらの構成もトランザクションのインポートについての基本機能は同じです。
WebLogic Serverのトランザクション・マネージャをルックアップし、サード・パーティ・システムでの必要に基づいて、XAResourceとして登録します。
トランザクション処理時に適切なトランザクション参加者を登録および登録解除します。
準備メッセージをWebLogic Serverのトランザクション・マネージャに送信します。このトランザクション・マネージャは、従属トランザクション・マネージャとして機能し、WebLogic Server内でトランザクション参加者の準備フェーズを調整します。
コミットまたはロールバック・メッセージをWebLogic Serverのトランザクション・マネージャに送信します。このトランザクション・マネージャは、従属トランザクション・マネージャとして機能し、WebLogic Server内でトランザクション参加者の2フェーズ・コミット・プロセスの第2フェーズを調整します。
必要に応じて登録解除します。
WebLogic Serverでクライアント介在トランザクション・マネージャを使用して、サード・パーティのトランザクション・マネージャが調整するトランザクションに対して2フェーズ・コミット・プロセスを駆動し、WebLogic Server内にJMSリソースやJDBCリソースなどのトランザクション参加者を含めることができます。クライアント介在トランザクション・マネージャは、javax.transaction.xa.XAResource
インタフェースの実装です。クライアント介在トランザクション・マネージャには、サード・パーティ・アプリケーションから直接アクセスします。通常は、サード・パーティ・アプリケーションのゲートウェイからアクセスします。サード・パーティ・システムのトランザクション・マネージャは、準備メッセージおよびコミット・メッセージをゲートウェイに送信し、ゲートウェイがそのメッセージをWebLogic Serverトランザクション・マネージャに伝播します。そして、WebLogic Serverのトランザクション・マネージャが従属トランザクション・マネージャとして機能し、WebLogic Server内でトランザクション参加者を調整します。図12-1は、2つのトランザクション・マネージャとクライアント側ゲートウェイの間の対話を示したものです。
図12-1 クライアント側ゲートウェイを使用したWebLogic Serverへのトランザクションのインポート
図12-2は、外部トランザクション・マネージャ、WebLogic Serverクライアント側JTAオブジェクト、およびWebLogic Serverトランザクション・マネージャの間の対話フローを示したものです。
図12-2 クライアント介在トランザクション・マネージャを使用したトランザクションのインポート手順を示した状態図
クライアント側ゲートウェイを使用してWebLogic Serverの介在トランザクション・マネージャにアクセスするには、次の手順を行う必要があります。
クライアント側ゲートウェイにおいて、WebLogic Server介在トランザクション・マネージャのXAResourceをgetClientInterposedTransactionManager
メソッドで取得できます。例:
import javax.naming.Context; import weblogic.transaction.InterposedTransactionManager; import weblogic.transaction.TxHelper; Context initialCtx; String serverName; InterposedTransactionManager itm = TxHelper.getClientInterposedTransactionManager(initialCtx, serverName);
サーバー名パラメータは、外部トランザクションに対して介在トランザクション・マネージャとして機能するサーバーの名前です。外部トランザクション・マネージャはクラッシュのリカバリ処理を行う際に、同じWebLogic Serverのサーバーに接続して、WebLogic Serverにインポート済の不明なトランザクションのリストを取得する必要があります。
詳細は、Oracle WebLogic Server APIリファレンスのweblogic.transaction.TxHelper
を参照してください。
介在トランザクション・マネージャを取得したら、その介在トランザクション・マネージャに関連付けられたXAResourceオブジェクトを取得する必要があります。
import javax.transaction.xa.XAResource; XAResource xar = itm.getXAResource();
クライアント側のゲートウェイを使用してトランザクションをインポートする際は、次の制限に注意してください。
クライアント側のゲートウェイでは、TxHelper.getServerInterposedTransactionManager()
メソッドを使用できません。
一度に使用できるWebLogic Serverクライアント介在トランザクション・マネージャは1つのみです。一度に2つ以上のクライアント介在トランザクション・マネージャ(異なるWebLogic Serverサーバーに接続している)を、トランザクションのインポートに使用しないでください。(この制限の詳細、およびWebLogic Server介在トランザクション・マネージャでのトランザクション処理の詳細については、「インポート済みトランザクションのトランザクション処理」を参照してください。)
WebLogic Serverでサーバー介在トランザクション・マネージャを使用して、サード・パーティのトランザクション・マネージャが調整するトランザクションに対して2フェーズ・コミット・プロセスを駆動し、WebLogic Server内にJMSリソースやJDBCリソースなどのトランザクション参加者を含めることができます。サーバー介在トランザクション・マネージャは、javax.transaction.xa.XAResource
インタフェースの実装です。WebLogic Serverにサーバー側のゲートウェイを作成して、サード・パーティ・システムからそのゲートウェイにアクセスして、サーバー介在トランザクション・マネージャにアクセスします。サード・パーティ・システムのトランザクション・マネージャから、準備メッセージおよびコミット・メッセージがサーバー側ゲートウェイに送信されます。それらのメッセージは、そのゲートウェイからWebLogic Serverトランザクション・マネージャに伝播します。そして、WebLogic Serverのトランザクション・マネージャが従属トランザクション・マネージャとして機能し、WebLogic Server内でトランザクション参加者を調整します。図12-3は、2つのトランザクション・マネージャとサーバー側ゲートウェイの間の対話を示したものです。
図12-3 サーバー側ゲートウェイを使用したWebLogic Serverへのトランザクションのインポート
サーバー側ゲートウェイを使用してWebLogic Serverの介在トランザクション・マネージャにアクセスするには、次の手順を行う必要があります。
サーバー側ゲートウェイにおいて、介在トランザクション・マネージャのXAResourceを次のようにして取得できます。
import javax.naming.Context; import weblogic.transaction.InterposedTransactionManager; import weblogic.transaction.TxHelper; InterposedTransactionManager itm = TxHelper.getServerInterposedTransactionManager();
詳細は、Oracle WebLogic Server APIリファレンスのweblogic.transaction.TxHelper
を参照してください。
介在トランザクション・マネージャを取得したら、XAResourceを取得する必要があります。「介在トランザクション・マネージャからのXAResourceの取得」を参照してください。
サーバー側のゲートウェイを使用してトランザクションをインポートする際は、次の制限に注意してください。
WebLogic Serverサーバーのサーバー側ゲートウェイでは、TxHelper.getClientInterposedTransactionManager()
メソッドを使用しません。このメソッドを使用すると、パフォーマンスの問題が発生します。
一度に使用できるWebLogic Serverサーバー介在トランザクション・マネージャは1つのみです。一度に2つ以上のサーバー介在トランザクション・マネージャ(同じスレッドにある)を、トランザクションのインポートに使用しないでください。(この制限の詳細、およびWebLogic Server介在トランザクション・マネージャでのトランザクション処理の詳細については、「インポート済みトランザクションのトランザクション処理」を参照してください。)
外部トランザクションをWebLogic Serverにインポートするには、外部トランザクション・マネージャまたはゲートウェイで、次の操作を行います。
xar.start(foreignXid, TMNOFLAGS);
この操作によって、現在のスレッドとインポート済トランザクションが関連付けられます。トランザクションとスレッドの関連付けが解除されるまで、他のサーバーに対する以降のすべての呼出しで、インポート済WebLogic Serverトランザクションが伝播されます。
注意: WebLogic Serverトランザクション・マネージャでは、フラグが無視されます。外部Xidが同じWebLogic Serverサーバーにインポート済の場合、WebLogic Serverは現在のスレッドをインポート済のWebLogic Serverトランザクションに関連付けます。 |
インポート済みのトランザクションと現在のスレッドの関連付けを解除するには、外部トランザクション・マネージャまたはゲートウェイで次の操作を行う必要があります。
xar.end(foreignXid, TMSUCCESS);
WebLogic Serverのトランザクション・マネージャがフラグを無視することに注意してください。
インポート済みのトランザクションに関して、次の処理の制限と動作に注意してください。
WebLogic Serverトランザクションが開始されたら、ゲートウェイでは同じスレッド上でstartを再び呼び出すことができません。クライアント側ゲートウェイで、1つのクライアント介在トランザクション・マネージャで一度に呼び出すことができるのは、xar.start
のみです。別のクライアント介在トランザクション・マネージャで(最初のトランザクション・マネージャでxar.end
を呼び出す前に)、xar.start
を呼び出そうとすると、XAER_RMERR
のXAException
がスローされます。サーバー側ゲートウェイを使用して、クライアントまたはサーバー介在トランザクション・マネージャでxar.start
を呼び出そうとすると、現在のスレッドにすでにアクティブなトランザクションが関連付けられている場合、XAER_RMERR
のXAException
がスローされます。
WebLogic Server介在トランザクション・マネージャのXAResourceは、異なるWebLogic Serverサーバー上で、疎結合のトランザクション・ブランチ動作を示します。つまり、同じ外部Xidが異なるWebLogic Serverサーバーにおいてインポートされると、異なるWebLogic Serverトランザクションにインポートされます。
WebLogic Serverのトランザクション・マネージャは、トランザクション・ツリーをフラット化しません。たとえば、前にエクスポートしたWebLogic Serverトランザクションのインポート済トランザクションは、元のWebLogic Serverトランザクションとは別のブランチに配置されます。
外部トランザクション・マネージャでは、WebLogic Serverにインポートされるすべての外部Xidが一意で、トランザクション破棄タイムアウト期間およびトランザクションのタイムアウト期間の合計値内で再利用されていないことを確認する必要があります。これができないと、ログ・レコードがWebLogic Serverトランザクション・マネージャで解放されなくなることがあります。その結果、クラッシュのリカバリが効率的に行われないおそれがあります。
外部トランザクション・マネージャは、他のXAResourceを駆動するように、2PCプロトコルにおいて介在トランザクション・マネージャを駆動する必要があります。WebLogic Server JTA (EJBコンテナなど)に登録されたbeforeCompletion
コールバックは、外部トランザクション・マネージャが介在トランザクション・マネージャのXAResourceを準備する際に呼び出されることに注意してください。afterCompletion
コールバックは、XAResource.commit
またはXAResource.rollback
の間に呼び出されます。
WebLogic Server介在トランザクション・マネージャは、http://www.oracle.com/technetwork/java/javaee/jta/index.html
の「Java Transaction API」に記載されているXAResource規約に準拠しています。
WebLogic Server介在トランザクション・マネージャは、外部トランザクション・マネージャによって準備されると、トランザクション破棄タイムアウトが経過するまで、外部トランザクション・マネージャからのコミットまたはロールバックを永続的に待機します。
WebLogic Server介在トランザクション・マネージャは、外部トランザクション・マネージャからトランザクションを無視するように指示されるか、トランザクション破棄タイムアウトが経過するまで、ヒューリスティックな出力を永続的に記憶します。
WebLogic Serverトランザクション・マネージャは、WebLogic Serverのすべての参加者の準備が正常に行われると、インポート済のトランザクションについて、prepare
レコードを記録します。インポート済のトランザクションについてWebLogic Serverの参加者が2つ以上ある場合、トランザクション・マネージャはXAResource.commit
が1フェーズ・コミットでもprepareレコードを記録します。
外部トランザクション・マネージャのクラッシュのリカバリの間、外部トランザクション・マネージャは、WebLogic Server介在トランザクション・マネージャのXAResourceを再び取得し、これに対してrecoverを呼び出す必要があります。WebLogic Server介在トランザクション・マネージャは、準備されたトランザクションまたはヒューリスティックに終了したトランザクションのリストを返します。外部トランザクション・マネージャでは、準備されたトランザクションをコミットまたはロールバックするか、ヒューリスティックに終了したトランザクションに対してforgetを呼び出すかのいずれかの方法で、これらの不明なトランザクションを解決する必要があります。