7.1 LRAでのJavaアプリケーションの開発

LRAトランザクション・プロトコルを使用するJAX-RSおよびSpring-RESTベースのアプリケーションを開発できます。

Eclipse Microprofileは、JAX-RSベースのRESTアプリケーションのLRAトランザクションを調整するための注釈およびAPIを提供します。https://download.eclipse.org/microprofile/microprofile-lra-1.0-M1/microprofile-lra-spec.html#introductionを参照してください。Spring Boot用のMicroTx LRAクライアントによって、Spring RESTベースのアプリケーションでLRAを使用できます。

JAX-RSおよびSpring RESTベースのアプリケーションでは、同じ名前と機能を持つLRA注釈が使用されます。ただし、JAX-RSアプリケーションでは、import static org.eclipse.microprofile.lra.annotation.ws.rs.LRAパッケージ(Eclipse MicroProfileパッケージ)が使用されます。Spring RESTベースのアプリケーションでは、com.oracle.microtx.springboot.lra.annotation.*パッケージ(カスタムMicroTxライブラリ・ファイル)が使用されます。LRA注釈の詳細は、https://download.eclipse.org/microprofile/microprofile-lra-1.0-M1/microprofile-lra-spec.htmlを参照してください。

7.1.1 LRAでのHelidonアプリケーションの開発

Helidonによって、LRAクライアント仕様のための実装が提供されます。

詳細は、https://helidon.io/docs/v2/#/mp/lra/01_introductionを参照してください。LRAトランザクション・プロトコルを使用するHelidonアプリケーションでは、MicroTxライブラリ・ファイルを使用しないでください。これらのアプリケーションの実装の詳細は、https://danielkec.github.io/blog/helidon/lra/saga/2021/10/12/helidon-lra.htmlを参照してください。

7.1.2 LRAでのSpring RESTベースのアプリケーションの開発

LRAトランザクション・プロトコルを使用するSpring RESTベースのアプリケーションでは、MicroTxによって提供されるJavaライブラリ・ファイルを使用する必要があります。

Spring RESTベースのアプリケーションのMicroTxライブラリ・ファイルおよびプロパティ値を含めるには:

  1. MicroTx Javaライブラリ・ファイルをSpring RESTベースのアプリケーションのpom.xmlファイルにmaven依存関係として含めます。次のサンプル・コードは23.4.1リリース用です。使用するリリース・バージョンに基づいて、正しいバージョンを指定してください。

    Spring Boot 3.xアプリケーションは、Jakarta EE9環境のJava 17で動作します。

    <dependency>
         <groupId>com.oracle.microtx.lra</groupId>
         <artifactId>microtx-lra-spring-boot-starter</artifactId>
         <version>23.4.1</version>
    </dependency>
  2. Spring RESTベースのアプリケーションのapplication.propertiesファイルで、次のプロパティを構成します。これにより、カスタム・ライブラリは、MicroTx LRAコーディネータとの通信を確立し、LRAトランザクションに参加して、調整されたトランザクションに関連するヘッダーを伝播できます。JAX-RSアプリケーションでは、このステップは実行しないでください。
    1. spring.microtx.lra.coordinator-url: MicroTx LRAコーディネータにアクセスするためのURLを入力します。これにより、MicroTxライブラリは、コーディネータと通信してトランザクションを調整できます。URLを取得するには、MicroTxにアクセスするためのURLに/lra-coordinatorを追加します。たとえば、https://192.0.2.1:443/api/v1/lra-coordinatorです。MicroTxにアクセスするためのURLを識別する方法の詳細は、「MicroTxへのアクセス」を参照してください。
    2. spring.microtx.lra.propagation-active: これをtrueに設定すると、送信リクエストのLRAコンテキスト・ヘッダーが伝播され、他のLRA参加側との適切な調整が行われます。
    3. spring.microtx.lra.participant-url: MicroTx LRAライブラリに関連付けられた参加側サービスのURLを入力します。MicroTxコーディネータは、指定されたURLを使用して参加側サービスに接続します。この値を次の形式で指定します。
      https://externalHostnameOfApp:externalPortOfApp/

      説明

      • externalHostnameOfApp: イニシエータ・サービスまたは参加側サービスの外部ホスト名。たとえば、bookTicket-appです。
      • externalPortOfApp: 参加側サービスにリモートでアクセスできるポート番号。たとえば、8081です。
    4. spring.microtx.lra.headers-propagation-prefix: 受信リクエストからカスタム・ライブラリ内の送信リクエストにヘッダーで伝播する接頭辞のリストを指定します。たとえば、トレース・ヘッダー、認可ヘッダーおよびカスタムMicroTxヘッダーです。これにより、指定された接頭辞が伝播されたLRAコンテキストのヘッダーとして含まれるため、トランザクション中に必要な情報が保持されます。
    5. spring.microtx.lra.retry-max-attempts: 障害が発生した場合にアプリケーションがMicroTxコーディネータへのリクエストの送信を再試行する最大回数を指定します。たとえば、15とします。デフォルト値は10です。
    6. spring.microtx.lra.retry-max-delay: 障害が発生した後でアプリケーションがMicroTxコーディネータへの同じリクエストの送信を再試行するまでの最大再試行間隔(ミリ秒)。たとえば、2000とします。デフォルト値は、1000ミリ秒です。

    たとえば、

    spring.microtx.lra.coordinator-url=http://tmm-app:9000/api/v1/lra-coordinator
    spring.microtx.lra.propagation-active=true
    spring.microtx.lra.participant-url=http://bookTicket-app:8081
    spring.microtx.lra.headers-propagation-prefix = {x-b3-, oracle-tmm-, authorization, refresh-}
    spring.microtx.lra.retry-max-attempts=15
    spring.microtx.lra.retry-max-delay=2000
  3. com.oracle.microtx.springboot.lra.annotation.*パッケージをインポートします。
    import com.oracle.microtx.springboot.lra.annotation.*
  4. オプション。次のステップは、SpringベースのREST参加側アプリケーションのメソッドを非同期で実行する場合にのみ実行します。コールされた参加側のメソッドが完全に実行されるまで待機してから別のメソッドをコールするかわりに、Async注釈を使用して、各メソッドを分離スレッドとして実行できます。
    1. com.oracle.microtx.springboot.lra.annotation.*パッケージをインポートします。
      import com.oracle.microtx.springboot.lra.annotation.*
    2. Springフレームワークで使用可能なSimpleAsyncTaskExecutorクラスをオーバーライドする、一意の名前のエグゼキュータBeanを作成します。エグゼキュータBeanの作成時に、MicroTxライブラリの一部であるMicroTxTaskDecoratorという名前のタスク・デコレータを設定する必要があります。次の例は、taskExecutorForTripBookingという名前のBeanを作成してから、MicroTxTaskDecorator (MicroTxタスク・デコレータ)を設定する方法を示しています。

      このタスクは、非同期で実行する各メソッドに対して実行します。

      コード例

      @Bean(name = "taskExecutorForTripBooking")
        public Executor asyncExecutor()
          {
              ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
              ... // application-specific code
              executor.setTaskDecorator(new MicroTxTaskDecorator());
              ... // application-specific code
              return executor;
          }

      Beanの名前を@Async注釈の属性として指定する必要があるため、この名前を書き留めます。

      アプリケーション・コードにすでにタスク・デコレータが含まれている場合は、新しいタスク・デコレータを作成するかわりに、MicroTxTaskDecoratorクラスのロジックを既存のタスク・デコレータに追加できます。

    3. 別のスレッドで実行するメソッドに@Async注釈を付けます。valueには、次の例に示すように、前のステップで作成したエグゼキュータBeanの名前を指定します。

      コード例

      @Async(value = "taskExecutorForTripBooking")
      @Override
      public CompletableFuture bookHotel(String name, String id) 
          {
      	//Code to implement the application's business logic
          }