8.4 TCCでのJavaアプリケーションの開発

MicroTxライブラリは、JAX-RSフィルタを使用して受信HTTPコールをインターセプトしてから、新しいTCCトランザクションを開始するか、既存のトランザクションに参加します。

次の注釈を使用して、アプリケーション・コードにTCC機能を追加し、参加側サービスを登録します。

  • @TCC(timeLimit = 120, timeUnit = ChronoUnit.SECONDS)

    これを使用して、MicroTxが新しいTCCトランザクションを開始または既存のトランザクションに参加するためにコールするアプリケーション固有のRESTリソースに注釈を付けます。

注釈をクラスに追加すると、JAX-RSフィルタがその注釈を探して、TCCトランザクションに参加するクラスを識別します。リクエスト・ヘッダーにlinkの値が含まれていない場合、MicroTxライブラリは、リクエスト・ヘッダーにlinkの値と一意のトランザクションIDを作成します。一意のトランザクションIDを使用して、トランザクションの識別、トレースまたはデバッグを行うことができます。

リクエスト・ヘッダーにlinkの値が含まれている場合、アプリケーションは既存のTCCトランザクションに参加します。トランザクションに参加するすべてのアプリケーションが、一意のTCCトランザクションIDを共有します。リクエスト・ヘッダーのlinkの値の例を次に示します:

link=[<http://tmm-app:9000/api/v1/tcc-transaction/7ff...>; rel="https://otmm.oracle.com/tcc-transaction/internal",<http://tmm-app:9000/api/v1/tcc-transaction/7ff...>; rel="https://otmm.oracle.com/tcc-transaction/external"]

ここで、7ff...が一意のトランザクションIDです。値の例は、読みやすくするために...を使用して一部を省いています。ご使用の環境でヘッダーを確認すると、値全体が表示されます。

8.4.1 トランザクション・イニシエータとしてのJavaアプリケーションの構成

開始する前に、MicroTxライブラリのプロパティ値を構成していることを確認してください。

  1. MicroTx Javaライブラリ・ファイルをアプリケーションのpom.xmlファイルにmaven依存関係として含めます。次のサンプル・コードは23.4.2リリース用です。使用するリリース・バージョンに基づいて、正しいバージョンを指定してください。
    • Helidon 2.xなどのJakarta EE8環境では、TmmLibファイルを使用します。

      <dependency>
           <groupId>com.oracle.tmm.jta</groupId>
           <artifactId>TmmLib</artifactId>
           <version>23.4.2</version>
      </dependency>
    • Helidon 3.xおよびSpring Boot 3.xアプリケーションなどのJakarta EE9環境では、TmmLib-jakartaファイルを使用します。Helidon 3.x。

      <dependency>
           <groupId>com.oracle.tmm.jta</groupId>
           <artifactId>TmmLib-jakarta</artifactId>
           <version>23.4.2</version>
      </dependency>
  2. イニシエータ・アプリケーション・リソース・クラスの前に@TCC注釈を追加します。これにより、新しいTCCトランザクションが開始され、トランザクション・イニシエータからのすべての送信REST APIリクエストにヘッダーが追加されます。

    次のコードを使用して、トランザクション・イニシエータ・サービスに対してコールが行われたときに新しいTCCトランザクションを開始します。次の例では、サービスを開始するコードがクラスmyTransactionInitiatorAppに含まれています。ご自身の環境に基づいてクラス名を置き換えます。

    import oracle.trm.tcc.annotation.TCC;
    @TCC(timeLimit = 120, timeUnit = ChronoUnit.SECONDS)  //Add @TCC annotation before the initiator application resource class to start a TCC transaction
    public class myTransactionInitiatorApp {
        // Service code that is specific to the transaction initiator service.
    }

    @TCC注釈を使用して、次のオプション・パラメータを指定できます。

    • timeLimit: トランザクション・イニシエータ・サービスでリソースを予約する期間を整数で指定します。期限切れになった後でリソースを解放してTCCトランザクションのその部分を取り消すために必要なコードを用意するのは、アプリケーション開発者の責任です。業務要件に基づいて期限を決めてください。
    • timeUnit: 指定する期限の単位(ChronoUnit.SECONDSChronoUnit.MINUTESなど)を指定します。指定できる値は、java.time.temporal.ChronoUnitクラスのすべての列挙値です。https://docs.oracle.com/javase/8/docs/api/java/time/temporal/ChronoUnit.htmlを参照してください。

8.4.2 トランザクション参加側としてのJavaアプリケーションの構成

開始する前に、MicroTxライブラリのプロパティ値を構成していることを確認してください。

  1. MicroTx Javaライブラリ・ファイルをアプリケーションのpom.xmlファイルにmaven依存関係として含めます。次のサンプル・コードは23.4.2リリース用です。使用するリリース・バージョンに基づいて、正しいバージョンを指定してください。
    • Helidon 2.xなどのJakarta EE8環境では、TmmLibファイルを使用します。

      <dependency>
           <groupId>com.oracle.tmm.jta</groupId>
           <artifactId>TmmLib</artifactId>
           <version>23.4.2</version>
      </dependency>
    • Helidon 3.xおよびSpring Boot 3.xアプリケーションなどのJakarta EE9環境では、TmmLib-jakartaファイルを使用します。Helidon 3.x。

      <dependency>
           <groupId>com.oracle.tmm.jta</groupId>
           <artifactId>TmmLib-jakarta</artifactId>
           <version>23.4.2</version>
      </dependency>
  2. トランザクション参加側アプリケーション・コードにTCC注釈を挿入します。
    参加側サービスが既存のTCCトランザクションに参加できるようにするには、トランザクション参加側サービスのリソース・クラスの前に@TCC注釈を追加します。

    次のコードをトランザクション参加側コードに挿入します。次の例では、myTransactionParticipantAppクラスにトランザクション参加側サービスのコードが含まれています。ご自身の環境に基づいてクラス名を置き換えます。

    import oracle.trm.tcc.annotation.TCC;
    import javax.ws.rs.core.Application;
     
    @Path("/")
    @TCC(timeLimit = 120, timeUnit = ChronoUnit.SECONDS)
    //Add @TCC annotation so that the transaction participant service joins an existing TCC transaction
    //The transaction initiator service passes the TCC context in the request header.
    public class myTransactionParticipantApp extends Application {
        // Service code that is specific to the transaction participant service. 
    }
  3. トランザクション参加側アプリケーション・コードで、addTccParticipant(String uri)メソッドをコールして、参加側サービスをTCCトランザクションに登録します。参加側サービスは、MicroTxがトランザクションの確定または取消しに使用するURIを公開します。MicroTxは、トランザクションを確定するためにPUTメソッドをコールし、トランザクションを取り消して予約済リソースを解放するためにDELETEメソッドをコールします。これらのメソッドが存在し、確定と取消しのロジックが実装されていることを確認します。トランザクションを確定または取り消すために、MicroTxはすべての参加側サービスの公開URIにコールを送信します。

    次のコード例は、参加側アプリケーション・コードに加える必要がある変更を示しています。

    
    public class myTransactionParticipantApp extends Application {
        // Service code that is specific to the transaction participant service. 
    
        @POST
        //The REST endpoint of the transaction participant service.
        @Path("bookings")
        @Consumes(MediaType.APPLICATION_JSON)
        public Response create() throws TccUnknownTransactionException
        // Business logic to create a booking.
          String bookingUri;
          // Register participant service with the TCC transaction
          TccClient.addTccParticipant(bookingUri.toString());
        }
    
        @PUT
        @Path("bookings/{bookingId}")
        @Consumes(MediaType.APPLICATION_JSON)
        public Response confirm() throws TccUnknownTransactionException {
        //Application-specific code to confirm the booking.
        }
     
        @DELETE
        @Path("bookings/{bookingId}")
        @Consumes(MediaType.APPLICATION_JSON)
        public Response cancel() throws TccUnknownTransactionException {
        //Application-specific code to cancel the booking.
        }          
    }

    説明

    • myTransactionParticipantAppは、トランザクション参加側サービスのコードを含むクラスです。このクラスには、参加側サービスがトランザクションの確定または取消しに使用するユーザー定義メソッドがすでに含まれています。
    • bookingsは、トランザクション参加側サービスのRESTエンドポイントです。トランザクション・イニシエータ・サービスがこのエンドポイントをコールして、ホテル予約の作成などのタスクを実行します。
    • bookingUriには、参加側サービスが公開するリソースURIと、MicroTxがトランザクションの確定または取消しに使用するリソースURIが含まれます。
    • bookingIdは、確定するか取り消す予約の一意IDです。
  4. 変更内容を保存します。
このような変更をすべてのトランザクション参加側サービスのコードで行ってください。