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

  1. MicroTxライブラリのプロパティ値を指定します。ライブラリ・プロパティの構成を参照してください。
  2. 次のMicroTxライブラリ・ファイルをJDBCアプリケーションのpom.xmlファイルにmaven依存関係として含めます。次のサンプル・コードは24.4リリース用です。使用するリリース・バージョンに基づいて、正しいバージョンを指定してください。Spring Boot 3.xアプリケーションは、Java 17で動作します。
    <dependency>
         <groupId>com.oracle.microtx</groupId>
         <artifactId>microtx-spring-boot-starter</artifactId>
         <version>24.4</version>
    </dependency>
  3. 次のパッケージをインポートします。
    import com.oracle.microtx.tcc.MicroTxTccClient;
    import com.oracle.microtx.tcc.annotation.TCC;
    import oracle.tmm.tcc.TccParticipantStatus;
    import oracle.tmm.tcc.exception.TccException;
    import oracle.tmm.tcc.exception.TccHeuristicException;
    import oracle.tmm.tcc.exception.TccUnknownTransactionException;
    import oracle.tmm.tcc.vo.CancelResponse;
    import oracle.tmm.tcc.vo.ConfirmResponse;
    import oracle.tmm.tcc.vo.TccParticipant;
  4. イニシエータ・アプリケーション・リソース・クラスの前に@TCC注釈を追加します。これにより、新しいTCCトランザクションが開始され、トランザクション・イニシエータからのすべての送信REST APIリクエストにヘッダーが追加されます。

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

    @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を参照してください。
  5. オブジェクト(MicroTxライブラリのクラス)を作成し、他のTCCトランザクション参加側サービスのエンドポイントをコールします。トランザクション・イニシエータ・サービスはトランザクションを開始します。トランザクションを完了するために、イニシエータ・サービスは1つ以上の参加側サービスをコールする必要があります。参加側サービスをコールするときに、作成したオブジェクトを使用します。

    MicroTxライブラリによって提供されるSpring Boot RestTemplateをオートワイヤします。

    @Autowired
    @Qualifier("MicroTxTccRestTemplate")
    RestTemplate restTemplate;

    次のいずれかの方法で、MicroTxライブラリによって提供されるインターセプタを構成します。これは、送信リクエストがトランザクションの一部である場合、または送信リクエストをインターセプトする場合に必要です。

    • 次の例に示すように、@FeignClient注釈の構成プロパティでインターセプタを構成します。
      @FeignClient(value = "<feign1.name>", url = "<feign1.url>", configuration = MicroTxTccFeignInterceptorConfig.class)
      public interface <interface_name> {
         // ...
      }

      ここで、<feign1.name>および<feign1.url>を環境に固有の値に置き換えます。後でアプリケーション・コードで使用するため、インタフェースの名前を書き留めておきます。

    • 次の例に示すように、プロパティ値を指定してインターセプタを構成します。これらの値は、MicroTxクライアント・ライブラリ・プロパティの値を含む同じファイルに指定します。
      spring.cloud.openfeign.client.config.<feign1_name>.request-interceptors[0]= com.oracle.microtx.springboot.tcc.clientinterceptor.MicroTxTccFeignInterceptorConfig

      ここで、<feign1_name>は、@FeignClient注釈のvalueプロパティのデータです。

  6. トランザクション・イニシエータ・アプリケーション・コードで、MicroTxTccClientオブジェクトを注入してから、注入されたオブジェクトを使用してトランザクションを確認または取り消します。次のコード例は、イニシエータ・アプリケーション・コードに加える必要がある変更を示しています。
    
    @TCC
    public class myTransactionParticipantApp {
        // Service code that is specific to the transaction participant service.
    
        @Autowired
        @Qualifier("MicroTxTccRestTemplate")
        RestTemplate restTemplate;
    
        @Autowired
        MicroTxTccClient tccClientService;
        ...          
    }
    
    @TCC
    public class myTransactionParticipantApp {
        // Service code that is specific to the transaction participant service.
    
        @Autowired
        MicroTxTccClient tccClientService;
        ...          
    }
  7. 変更内容を保存します。
MicroTxライブラリを使用するサンプルSpring RESTトランザクション・イニシエータ・アプリケーションのソース・コードは、microtx-samples GitHubリポジトリにあるtravel-agent-springbootフォルダにあります。これは、MicroTxライブラリとアプリケーションの統合時に参照として使用できます。