8.3.3 SagaでのSpring Bootアプリケーションの開発

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

Spring BootアプリケーションのMicroTxライブラリのリファレンス情報は、『Oracle® Transaction Manager for Microservices Spring Boot API Reference for Saga』を参照してください。

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

  1. MicroTx Javaライブラリ・ファイルをSpring Bootアプリケーションの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. アプリケーションのapplication.propertiesファイルで、MicroTxライブラリ・プロパティの値を指定します。これにより、カスタム・ライブラリは、MicroTx Sagaコーディネータとの通信を確立し、Sagaトランザクションに参加して、調整されたトランザクションに関連するヘッダーを伝播できます。「JavaアプリケーションのMicroTxライブラリ・プロパティの構成」を参照してください。
  3. com.oracle.microtx.springboot.lra.annotation.*パッケージをインポートします。
    import com.oracle.microtx.springboot.lra.annotation.*
  4. オブジェクト(MicroTxライブラリのクラス)を作成し、他のSagaトランザクション参加側サービスのエンドポイントをコールします。トランザクション・イニシエータ・サービスはトランザクションを開始します。トランザクションを完了するために、イニシエータ・サービスは1つ以上の参加側サービスをコールする必要があります。参加側サービスをコールするときに、作成したオブジェクトを使用します。

    MicroTxライブラリによって提供されるSpring Boot RestTemplateを自動設定します。

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

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

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

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

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

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

  5. オプション。次のステップは、Spring Boot参加側アプリケーションのメソッドを非同期で実行する場合にのみ実行します。コールされた参加側のメソッドが完全に実行されるまで待機してから別のメソッドをコールするかわりに、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
          }
MicroTxライブラリを使用するサンプルSpring RESTベースのトランザクション・イニシエータ・アプリケーションのソース・コードは、microtx-samples GitHubリポジトリのtrip-manager-springbootフォルダにあります。MicroTxライブラリを使用するサンプルSpring RESTベースのトランザクション参加側アプリケーションのソース・コードは、microtx-samples GitHubリポジトリのhotel-springbootフォルダにあります。これらのファイルは、MicroTxライブラリとアプリケーションの統合時に参照として使用できます。