Oracle® Fusion Middleware Oracle WebLogic Server JTAアプリケーションの開発 12c (12.2.1) E72527-01 |
|
前 |
次 |
この章では、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介在トランザクション・マネージャ(ITM)を登録する必要があります。その結果、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内でトランザクション参加者を調整します。図14-1に、2つのトランザクション・マネージャとクライアント側ゲートウェイとの間の対話を示します。
図14-1 クライアント側ゲートウェイを使用したWebLogic Serverへのトランザクションのインポート
図14-2に、外部トランザクション・マネージャ、WebLogic Serverのクライアント側JTAオブジェクトおよびWebLogic Serverトランザクション・マネージャの間の対話フローを示します。
図14-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 Java APIリファレンスの
weblogic.transaction.TxHelperを参照してください。
介在トランザクション・マネージャを取得したら、その介在トランザクション・マネージャに関連付けられたXAResourceオブジェクトを取得する必要があります。
import javax.transaction.xa.XAResource; XAResource xar = itm.getXAResource();
クラスタのすべての介在トランザクション・マネージャに渡り分散トランザクションのクラスタ全体でトランザクションを回復するよう構成するには、Oracle WebLogic Server管理コンソール・オンライン・ヘルプ
のクラスタ: 構成: JTAページでEnable Cluster-Wide Recovery属性を選択します。
WebLogicクラスタ内の各介在トランザクション・マネージャが有効になっている場合、クラスタ全体にわたるトランザクションの分散が認識されます。これにより、各クラスタ・メンバー上の介在トランザクション・マネージャでは特定のXA呼出しを処理する必要があるか、または別のクラスタ・メンバーの適切な介在トランザクション・マネージャに転送する必要があるかが判断されます。さらに、次のように処理されます。
WebLogicクラスタ内の単一のITM上のXAResource.recover
呼出しは、そのクラスタ内のすべての介在トランザクション・マネージャのうちのインダウト・トランザクションのリストを返します。
クラスタ・メンバーが失敗した場合、介在トランザクション・マネージャは同じクラスタ内の別のクラスタ・メンバーに移行されます。
WebLogic分散宛先がクラスタ上に存在する場合、メッセージは介在トランザクション・マネージャをホストするメンバーではなく、他のクラスタ・メンバーへロード・バランスされる可能性があります。このようになると、介在トランザクション・マネージャでは任意のXA呼出しが透過的に処理され、適切なクラスタ・メンバーのインスタンスに転送されます。宛先をホストするクラスタ・メンバーが失敗した場合。介在トランザクション・マネージャは分散メンバーの潜在的フェイルオーバーを透過的に処理します。
WebLogic Serverでサーバー介在トランザクション・マネージャを使用して、サード・パーティのトランザクション・マネージャが調整するトランザクションに対して2フェーズ・コミット・プロセスを駆動し、WebLogic Server内にJMSリソースやJDBCリソースなどのトランザクション参加者を含めることができます。サーバー介在トランザクション・マネージャは、javax.transaction.xa.XAResource
インタフェースの実装です。WebLogic Serverにサーバー側のゲートウェイを作成して、サード・パーティ・システムからそのゲートウェイにアクセスして、サーバー介在トランザクション・マネージャにアクセスします。サード・パーティ・システムのトランザクション・マネージャから、準備メッセージおよびコミット・メッセージがサーバー側ゲートウェイに送信されます。それらのメッセージは、そのゲートウェイからWebLogic Serverトランザクション・マネージャに伝播します。そして、WebLogic Serverのトランザクション・マネージャが従属トランザクション・マネージャとして機能し、WebLogic Server内でトランザクション参加者を調整します。図14-3は、2つのトランザクション・マネージャとサーバー側ゲートウェイの間の対話を示したものです。
図14-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 Java 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を呼び出すかのいずれかの方法で、これらの不明なトランザクションを解決する必要があります。
異なるトランザクション・マネージャ・システムにまたがるトランザクション・ブランチの密結合を構成するには、Oracle WebLogic Server管理コンソール・オンライン・ヘルプ
のクラスタ: 構成: JTAページでEnable Tightly Coupled Transactions属性を選択します。
Enable Tightly Coupled Transactions
属性が有効になっている場合、WebLogic Serverは、内部でトランザクションIDをマッピングするのではなく、XA呼出しに対して介在トランザクション・マネージャによってインポートされたトランザクションのトランザクション識別子を使用します。このトランザクション・マネージャのさらに密接な結合は、通常、パフォーマンスを向上し、ドメイン間のWebLogicトランザクションとTuxedoからインポートされたトランザクションに適用します。
注意:
|