7.11.2 トランザクション・イニシエータとしてのJAX-RSアプリケーションの構成

トランザクション・イニシエータ・サービスは、トランザクションを開始します。トランザクション・イニシエータ・サービスは、アプリケーションのビジネス・ロジックに基づいて、トランザクションの開始のみ、またはトランザクションの開始とトランザクションへの参加を行うことができます。

開始する前に、アプリケーションがトランザクションを開始するだけか、トランザクションを開始して参加するのかを確認します。2つのシナリオでは要件が若干異なるため、それに応じてアプリケーションを構成します。

2つのシナリオを検討して、アプリケーションがトランザクションを開始するだけか、トランザクションにも参加するかを理解します。
  • シナリオ1: 銀行振込アプリケーションによって、ある部門から別の部門に送金します。この場合、振込アプリケーションはトランザクションを開始するだけで、トランザクションには参加しません。振込アプリケーションは、トランザクションを完了するためにビジネス・ロジックに基づいて様々なサービスをコールします。データベース・インスタンスは、振込アプリケーションにアタッチされる場合とアタッチされない場合があります。
  • シナリオ2: 銀行振込アプリケーションによって、ある部門から別の部門に送金します。振込アプリケーションは、トランザクションごとに手数料として1%を請求します。この場合、振込アプリケーションはトランザクションを開始して参加します。データベース・インスタンスは、トランザクション情報を保存するために振込アプリケーションにアタッチされる必要があります。
Javaアプリケーションをトランザクション・イニシエータとして構成するには:
  1. MicroTxライブラリのプロパティ値を指定します。「JAX-RSおよびNode.jsアプリケーションのライブラリ・プロパティの構成」を参照してください。
  2. MicroTx Javaライブラリ・ファイルをアプリケーションのpom.xmlファイルにmaven依存関係として含めます。次のサンプル・コードは24.4リリース用です。使用するリリース・バージョンに基づいて、正しいバージョンを指定してください。
    • Helidon 2.xなどのJakarta EE8環境では、TmmLibファイルを使用します。

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

      <dependency>
           <groupId>com.oracle.tmm.jta</groupId>
           <artifactId>TmmLib-jakarta</artifactId>
           <version>24.4</version>
      </dependency>
  3. oracle.tmm.jta.TrmUserTransactionパッケージをインポートします。
    import oracle.tmm.jta.TrmUserTransaction;
  4. オプション。トランザクションをアクティブにしておく期間(ミリ秒)を指定します。トランザクションのコミットまたはロールバックが指定した期間内に行われないと、トランザクションはロールバックされます。これにより、アプリケーションのtmm.propertiesファイルのoracle.tmm.TransactionTimeoutプロパティ値がオーバーライドされます。「トランザクション・タイムアウトの設定」を参照してください。
    transaction.setTransactionTimeout(60000);
  5. すべての新しいトランザクションでTrmUserTransactionクラスのオブジェクトを初期化し、アプリケーション・コード内のトランザクション境界(トランザクションの開始、コミットまたはロールバックなど)を定めます。アプリケーション・ロジックがトランザクションを開始する前にオブジェクトを初期化します。
    次のコード・サンプルは、utというTrmUserTransactionクラスのインスタンスを作成する方法を示しています。
    UserTransaction ut = new oracle.tmm.jta.TrmUserTransaction();
  6. 次のコード・サンプルは、コールされた新しいXAトランザクションを開始する方法を示しています。
    • アプリケーションがトランザクションを開始するだけでトランザクションに参加しない場合は、次の行をアプリケーション・コードに追加して、XAトランザクションを開始します。

      
      ut.begin();
      ... // Implement the business logic to begin a transaction.
    • アプリケーションがトランザクションを開始して参加する場合は、次の行をアプリケーション・コードに追加して、XAトランザクションを開始します。

      
      ut.begin(true);
      ... // Implement the business logic to begin a transaction.
      
  7. RESTクライアントを作成します。

    次のコマンドによって、svcClientという新しいクライアントが作成されます。

    Client svcClient = ClientBuilder.newClient();

    このRESTクライアントを使用して、トランザクション参加側サービスのエンドポイントをコールし、トランザクションを実行します。トランザクション・イニシエータ・サービスはトランザクションを開始します。トランザクションを完了するために、イニシエータ・サービスは1つ以上の参加側サービスをコールする必要があります。参加側サービスをコールするときに、作成したRESTクライアントを使用します。

  8. ビジネス・ロジックに基づいて、トランザクションをコミットまたはロールバックします。
    • トランザクションをコミットするには:

      ut.commit();
    • トランザクションをロールバックするには:

      ut.rollback();
MicroTxライブラリおよびXAを使用するサンプルJAX-RSトランザクション・イニシエータ・アプリケーションのソース・コードは、microtx-samples GitHubリポジトリにあるtellerフォルダにあります。これは、MicroTxライブラリとアプリケーションの統合時に参照として使用できます。これは、イニシエータ・アプリケーションのビジネス・ロジックでMicroTxライブラリを使用する方法の例です。このサンプル・アプリケーションは振込(Teller)という名前です。これは2つの部門間のトランザクションを開始します。部門Aをコールして一定金額を引き出し、部門Bをコールして預け入れます。
イニシエータ・サービスが、トランザクションを開始するだけでなくトランザクションに参加する場合、トランザクションに参加してリソース・マネージャと通信するアプリケーションのために追加の構成を行う必要があります。「トランザクション参加側としてのJAX-RSアプリケーションの構成」を参照してください。microtx-samples GitHubリポジトリにあるteller-as-participantフォルダは、トランザクションに参加もするJAX-RSトランザクション・イニシエータ・アプリケーションのソース・コードを提供します。