7.6.3 XAトランザクション通知の受信の登録

トランザクション・イニシエータ・サービスおよび参加側サービスを登録して、通知を受信できます。MicroTxは、イベントの発生時(準備フェーズの前およびMicroTxがトランザクションを正常にコミットまたはロールバックしたとき)に、登録したサービスについて通知します。

MicroTxコーディネータが、登録したサービスについて通知します。イベントの発生時にビジネス・ロジックに基づいてサービスが追加のタスクを実行するようにする場合には、サービスの登録をお薦めします。登録するリソースごとに、コールバック・リソースを作成し、2つのメソッドを宣言する必要があります(MicroTxが、イベント発生時に通知を送信するためにこれらをコールします)。

ノート:

この機能は、Javaサービスでのみ使用可能です。
イベント通知を受信するために登録するトランザクション参加側サービスおよびイニシエータ・サービスに対して、次のタスクを実行します。
  1. アプリケーション・コード内に、コールバック・リソースを作成するコードを追加します(イベント発生時にMicroTxコーディネータがこれをコールします)。

    2つのメソッドを含むJAX-RSクラスを作成します。beforeCompletionメソッドおよびafterCompletionメソッドの宣言は必須です。これらのメソッド内に、アプリケーションのビジネス・ロジックに固有のコードを指定します。MicroTxコーディネータはbeforeCompletionメソッドをコールしてから、参加側に準備させるリクエストを送信します。afterCompletionメソッドは、トランザクションの完了後にイベントの最終ステータスを返します。ステータスは、STATUS_COMMITTEDまたはSTATUS_ROLLEDBACKです。

    次のサンプル・コードでは、EventListenerResourceがJAX-RSクラスの名前、transaction-syncはコールバック・リソースの名前です。クラスおよびコールバック・リソースには任意の名前を指定できます。後で指定する必要があるため、このリソースの名前を書き留めてください。

    サンプル・コード

    @Path("transaction-sync")
    public class EventListenerResource {
         
        /**
        * The MicroTx coordinator calls the beforeCompletion method before 
        * the two-phase transaction commit process starts. This call is executed with
        * the transaction  context of the transaction that is being committed.
        **/
        @POST
        @Path("/{gtrid}/beforecompletion")
        @Produces(MediaType.APPLICATION_JSON)
        public Response beforeCompletion(@PathParam("gtrid") String gtrid) {
            ...
            //tasks to be done before the transaction is completed 
            //enter the code based on your application's business logic
            return Response.status(Response.Status.OK).build();
        }
     
        /**
        * The MicroTx coordinator calls the afterCompletion method after the 
        * transaction is committed or rolled back.
        **/
        @POST
        @Path("/{gtrid}/aftercompletion/{status}")
        @Produces(MediaType.APPLICATION_JSON)
        public Response afterCompletion(@PathParam("gtrid") String gtrid, @PathParam("status") String status) {
           ...
           //tasks to be done after the transaction is completed 
           //enter the code based on your application's business logic
           return Response.status(Response.Status.OK).build();
        }
    }
  2. アプリケーションのビジネス・ロジックに基づいてイベント通知を受信するためにイニシエータ・サービスを登録します。

    次のサンプル・コードで、TrmRegisterSynchronization.register()メソッドをコールするのは、begin()をコールした後で、commit()またはrollback()をコールする前であることが示されます。TrmRegisterSynchronization.register()メソッドをコールする際には、前のステップで作成したコールバック・リソースの名前を渡す必要があります。

    サンプル・コード

    import oracle.tmm.jta.TrmUserTransaction;
    /**
    * Initiator method which initiates the transaction
    */
    transactionMethod() {
        TrmUserTransaction transaction = new TrmUserTransaction();
        transaction.begin();
        //
        TrmRegisterSynchronization.register(transaction.getTransactionID(), "/transaction-sync");
        ...
        // code that is specific to the application's business logic
        transaction.commit();
    }

    説明

    • transaction-syncは、前のステップで作成したコールバック・リソースの名前です。ご自身の環境に基づいてこの値を置き換えてください。
    • transaction.getTransactionID()は、現在のトランザクションのGTRIDです。TrmUserTransactionクラス・オブジェクトを使用して、現在のトランザクションのGTRIDを取得します。
  3. イベント通知を受信するために1つ以上のトランザクション参加側サービスを登録します。アプリケーションのビジネス・ロジックに基づいて、アプリケーションでイベント通知を受信する必要があるかどうかを決定できます。

    次のサンプル・コードは、GTRID値および以前に作成したコールバック・リソースの名前を明示的に渡して、TrmRegisterSynchronization.register()メソッドをコールする方法を示しています。

    サンプル・コード

    import oracle.tmm.jta.TrmRegisterSynchronization;
    /**
    * Participant method which is in transaction context.
    * Transaction event registration using GTRID
    */
    participantMethod1(){
        TrmXaContext trmXaContext = ThreadLocalXaContext.get();
        if (trmXaContext != null) {
            String currentTransactionGTRID = new String(trmXaContext.trmXid.getGlobalTransactionId());
            TrmRegisterSynchronization.register(currentTransactionGTRID, "/transaction-sync");
        }
        ...
        // code that is specific to the application's business logic
    }
     

    説明

    • transaction-syncは、前に作成したコールバック・リソースの名前です。ご自身の環境に基づいてこの値を置き換えてください。
    • currentTransactionGTRIDは、現在のトランザクションのGTRIDです。ThreadLocalから現在のトランザクションのGTRIDを取得するには、TrmXaContextを使用します。これは、トランザクション・イニシエータ・サービスにも参加側サービスにも適用されます。