- Transaction Manager for Microservices開発者ガイド
- TCCでのアプリケーションの開発
- TCCでのSpring Bootアプリケーションの開発
- トランザクション・イニシエータとしてのSpring RESTアプリケーションの構成
9.5.1 トランザクション・イニシエータとしてのSpring RESTアプリケーションの構成
- MicroTxライブラリのプロパティ値を指定します。ライブラリ・プロパティの構成を参照してください。
- 次の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>
- 次のパッケージをインポートします。
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;
- イニシエータ・アプリケーション・リソース・クラスの前に
@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.SECONDS
やChronoUnit.MINUTES
など)を指定します。指定できる値は、java.time.temporal.ChronoUnit
クラスのすべての列挙値です。https://docs.oracle.com/javase/8/docs/api/java/time/temporal/ChronoUnit.htmlを参照してください。
- オブジェクト(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
プロパティのデータです。
- 次の例に示すように、
- トランザクション・イニシエータ・アプリケーション・コードで、
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; ... }
- 変更内容を保存します。
MicroTxライブラリを使用するサンプルSpring RESTトランザクション・イニシエータ・アプリケーションのソース・コードは、
microtx-samples
GitHubリポジトリにあるtravel-agent-springboot
フォルダにあります。これは、MicroTxライブラリとアプリケーションの統合時に参照として使用できます。
親トピック: TCCでのSpring Bootアプリケーションの開発