6 MicroTxを使用したWebLogic ServerとHelidon間のXAグローバル・トランザクションの統合

Oracle Transaction Manager for Microservices (MicroTx) Freeは、Oracle WebLogic Server (WebLogic Server)アプリケーション、Helidonマイクロサービス、およびHelidonとWebLogic Serverの両方にデプロイされたJDBCリソース間で、XAトランザクションの一貫性を保証します。現時点では、MicroTx Freeとの統合は評価目的でのみ提供されます。

この章では、次の分散アプリケーションを例として使用して、MicroTxがXAトランザクションの一貫性を保証する方法について説明します。この例では、アプリケーションはKubernetesクラスタにデプロイされます。ただし、この例で説明するXAトランザクションの統合はKubernetesに依存せず、サポートされている任意のプラットフォームに実装できます。

  • Helidon Tellerアプリケーション(トランザクション・イニシエータ)
  • Helidonアプリケーション(参加側アプリケーション)
  • WebLogic Server (参加側アプリケーション)
  • MicroTxトランザクション・コーディネータ

次の図は、様々なアプリケーション間のXAトランザクションのフローと、トランザクションのコーディネータとしてのMicroTxの役割を示しています。ここで、XAトランザクションはHelidon Tellerアプリケーションによって開始され、他のHelidonおよびWebLogic Serverアプリケーション(トランザクションの参加側アプリケーション)に分散されます:

図6-1 WebLogic Server、HelidonおよびMicroTxの統合



この章の内容は次のとおりです。

前提条件

この例では、アプリケーションがKubernetesで実行されており、WebLogic Server、WebLogic Kubernetes Operator (Operator)、HelidonおよびMicroTxが同じKubernetesクラスタにすでにデプロイされていることを前提としています。
「WebLogic ServerとHelidonの統合のためのKubernetesクラスタの準備」を参照してください。

ノート:

MicroTxとのトランザクション統合は、WebLogic Server 14c (14.1.1.0)およびHelidon 2.xでのみサポートされます。これらのリリースの製品はJDK 11をサポートしているためです。

MicroTxをKubernetesクラスタにデプロイするには、Oracle Container RegistryからMicroTxイメージを取得します。サンプル、クライアント・ライブラリおよびデプロイメント・スクリプトを取得するには、Transaction Manager for Microservices FreeからMicroTxバイナリをダウンロードします。

Transaction Manager for Microservices FreeからのMicroTxバイナリのダウンロード

  1. https://www.oracle.com/database/transaction-manager-for-microservices/に移動して、「MicroTxを無料でダウンロード」をクリックし、Oracle Transaction Manager for Microservices Freeのインストール・バンドル(.zipファイル)をダウンロードします。Oracle Software Delivery Cloudが表示されます。
  2. ZIPファイルは、Oracle Download Managerを使用するか、単にダウンロードするファイルをクリックしてダウンロードできます。
  3. ZIPファイルのコンテンツを、可能なかぎり新しいディレクトリに解凍します。otmm-22.3.2フォルダには、次のフォルダが含まれます:
    • lib: このフォルダには、MicroTxライブラリ・ファイルが含まれます。MicroTxを使用してアプリケーション・マイクロサービス間のトランザクションを管理するには、アプリケーション・コードでこれらのライブラリ・ファイルを使用する必要があります。
    • otmm: このフォルダには、MicroTxイメージおよびYAMLファイルが含まれ、これを使用してMicroTxをインストールおよび構成できます。このフォルダ内のイメージは、Oracle Container Registryで使用可能なイメージと同じです。Oracle Container RegistryからMicroTxイメージを使用することをお薦めします。ダウンロードするステップは、Oracle Container RegistryからのMicroTxイメージのダウンロードを参照してください。
    • samples: このフォルダには、様々なトランザクション・プロトコルのサンプル・アプリケーションのソース・コードが含まれています。サンプル・アプリケーションのソース・コードには、MicroTxライブラリも含まれています。

      ノート:

      ビルドおよび統合の手順を理解するために、サンプル・ドキュメントを確認することをお薦めします。

Oracle Container RegistryからのMicroTxイメージのダウンロード

  1. Oracle Container Registryに移動します。
  2. 検索ボックスで、Oracle Transaction Managerを指定し、「検索結果」ページでotmmをクリックします。
  3. ページの「タグ」セクションで、MicroTxの使用可能なバージョンを表示できます。最新バージョンをダウンロードするには、次のコマンドを実行します:
    docker pull container-registry.oracle.com/database/otmm:latest
    特定のバージョン(バージョン22.3.2など)をダウンロードするには、次のコマンドを実行します:
    docker pull container-registry.oracle.com/database/otmm:22.3.2

また、前提条件の一部として次のタスクを実行します:

  • WebLogic Server XAデータ・ソースまたは2フェーズ・コミットのエミュレート・データ・ソースを構成し、WebLogicクラスタにターゲット指定します。このデータ・ソースは、WebLogic JAX-RSベースのWebアプリケーション(MicroTxライブラリを含む)がデータベースに接続するために使用されます。
  • JTAトランザクション・ログをJDBCストアとして構成します。『WebLogic永続ストアの管理』JDBC TLogストアの使用に関する項を参照してください。
  • WebLogic ServerとHelidonアプリケーション間の通信を有効にするには、次のことを確認します:
    • MicroTxトランザクション・コーディネータ・サービス(TCS)が稼働している。
    • Helidon Tellerアプリケーションが稼働している。
    • WebLogic Serverが、MicroTx TCSおよびTellerサービスと通信できる。
  • デフォルトでは、同じKubernetesクラスタの一部として構成されたすべてのリソースは、短縮名または完全修飾ドメイン名(FQDN)を使用して相互に通信します。なんらかの制限がある場合は、ネットワーク・ルールを追加して、MicroTx TCSの操作を有効にする必要があります。
データ・ソースを構成するには、次のいずれかのオプションを使用します:
  • WebLogic Deploy Tooling (WDT)モデル: 「イメージ内のモデル」ドメイン・ホーム・パターンの場合、WDTモデル・ファイルを使用してデータ・ソースを構成できます。Model in Imageを参照してください。
  • WebLogic Scripting Tool (WLST): 「永続ボリューム(PV)内のドメイン」ドメイン・ホーム・パターンの場合、WLSTを使用してデータ・ソースを構成できます。Domain Home on a PVを参照してください。
  • WebLogic Server管理コンソール: 「永続ボリューム(PV)内のドメイン」ドメイン・ホーム・パターンの場合、管理コンソールを使用してデータ・ソースを構成できます。Domain Home on a PVを参照してください。

また、次を完了しておく必要があります:

MicroTxと連携するためのWebLogic Serverの準備

データ・ソースを含むWebLogic ServerとHelidonアプリケーション間のトランザクション調整を有効にするには、まず、データベースに接続するためにアプリケーションで使用されるデータ・ソースを作成してデプロイする必要があります。また、WebLogicクラスタ用にJTA TLog JDBCストアを構成する必要があります。

WebLogic Deploy Toolingを使用したJDBCデータ・ソースの作成

WDTを使用して、XAデータ・ソースおよび非XAデータ・ソースを作成します。WDTの詳細は、WebLogic Deploy Toolingを参照してください。

WebLogic Deploy Toolingを使用したXAデータ・ソースの作成

WDTを使用したXAデータ・ソースoraxadsの作成例:

resources:
    JDBCSystemResource:
        oraxads:
            Target: cluster-1
            JdbcResource:
                DatasourceType: GENERIC
                JDBCConnectionPoolParams:
                    TestFrequencySeconds: 600
                    InitialCapacity: 2
                    ConnectionReserveTimeoutSeconds: 10
                    TestConnectionsOnReserve: true
                    MaxCapacity: 30
                    TestTableName: SQL SELECT 1 FROM DUAL
                    MinCapacity: 3
                JDBCDataSourceParams:
                    JNDIName: oraxads
                    GlobalTransactionsProtocol: TwoPhaseCommit
                JDBCDriverParams:
                    DriverName: oracle.jdbc.xa.client.OracleXADataSource
                    PasswordEncrypted: '@@PROP:oraxads.password@@'
                    URL: jdbc:oracle:thin:@//@@PROP:oraxads.url@@
                    Properties:
                        user:
                            Value: '@@PROP:oraxads.user@@'
                        databaseName: {}
WebLogic Deploy Toolingを使用した非XAデータ・ソースの作成

WDTを使用した非XAデータ・ソースjtadsの作成例:

resources:
    JDBCSystemResource:
        jtads:
            Target: cluster-1
            JdbcResource:
                DatasourceType: GENERIC
                JDBCConnectionPoolParams:
                    TestFrequencySeconds: 600
                    InitialCapacity: 2
                    ConnectionReserveTimeoutSeconds: 10
                    TestConnectionsOnReserve: true
                    MaxCapacity: 30
                    TestTableName: SQL SELECT 1 FROM DUAL
                    MinCapacity: 3
                JDBCDataSourceParams:
                    JNDIName: jtads
                    GlobalTransactionsProtocol: None
                JDBCDriverParams:
                    DriverName: oracle.jdbc.OracleDriver
                    PasswordEncrypted: '@@PROP:jtads.password@@'
                    URL: jdbc:oracle:thin:@//@@PROP:jtads.url@@
                    Properties:
                        user:
                            Value: '@@PROP:jtads.user@@'
                        databaseName: {}
JDBCストアとしてのJTAトランザクション・ログの構成

JTAトランザクション・ログをJDBCストアとして構成する前に、トランザクション・ログ・ストアがトランザクションの記録に使用するデータ・ソースを作成していることを確認してください。WebLogic Deploy Toolingを使用したJDBCデータ・ソースの作成を参照してください。

次のいずれかの方法で、JTAトランザクション・ログをJDBCストアとして構成できます:

WebLogic Deploy Toolingを使用したJDBCストアとしてのJTAトランザクション・ログの構成

次のWDTスクリプトの例では、非XAデータ・ソースjtadsを使用して、JTAトランザクション・ログをJDBCストアとして構成します:

topology:
    ServerTemplate:
        server-template_1:
            TransactionLogJDBCStore:
                Enabled: true
                DataSource: jtads
                PrefixName: TLOG_${serverName}_
WebLogic Scripting Toolを使用したJDBCストアとしてのJTAトランザクション・ログの構成

次のWLSTスクリプトの例では、非XAデータ・ソースjtadsを使用して、JTAトランザクション・ログをJDBCストアとして構成します:

import sys,os,socket, traceback
 
adminUsername=sys.argv[1]
adminPassword=sys.argv[2]
adminT3URL=sys.argv[3]
 
connect(adminUsername,adminPassword,adminT3URL)
edit()
startEdit()
##Here SERVER_TEMPLATE_NAME refers to WebLogic dynamic-cluster Server Template Name
cd('/ServerTemplates/SERVER_TEMPLATE_NAME')
cd('/ServerTemplates/SERVER_TEMPLATE_NAME/TransactionLogJDBCStore/SERVER_TEMPLATE_NAME')
##Here jtads refers to datasource name used for Transaction Log JDBC Store
cmo.setDataSource(getMBean('/JDBCSystemResources/jtads'))
cmo.setEnabled(true)
cmo.setPrefixName('TLOG_${serverName}_')
save()
activate()
disconnect()
管理コンソールを使用したJDBCストアとしてのJTAトランザクション・ログの構成
JTAトランザクション・ログをJDBCストアとして構成するには:
  1. WebLogic Server管理コンソールにログインします。
  2. まだ行っていない場合は、管理コンソールの「チェンジ・センター」で、「ロックして編集」をクリックします
  3. コンソールの左ペインで、「環境」「クラスタ」の順に展開し、「サーバー・テンプレート」をクリックします。
  4. コンソールの右ペインで、テンプレートのリストからテンプレートを選択します。
  5. 「サーバー・テンプレート設定」画面で、「構成」タブを選択し、「サービス」タブをクリックします。
  6. 画面の「トランザクション・ログ・ストア」セクションで、次を指定します:
    • 「タイプ」フィールドで、JDBCを選択します。
    • 「データ・ソース」フィールドで、jtadsを選択します。

      ノート:

      ここでは、非XAデータ・ソースjtadsが使用されます。このデータ・ソースは、WDTスクリプトを使用してすでに作成されています。WebLogic Deploy Toolingを使用した非XAデータ・ソースの作成を参照してください。
    • 「接頭辞名」フィールドで、TLOG_${serverName}_を選択します。
  7. 変更内容を保存します。

MicroTx構成の変更

Kubernetesで実行する場合、MicroTxによって調整されるWebLogic ServerとHelidon間のトランザクション統合では、WebLogic Server、HelidonおよびMicroTxを同じKubernetesクラスタにデプロイし、すべてのKubernetesリソースおよびサービスを構成する必要があります。「WebLogic ServerとHelidonの統合のためのKubernetesクラスタの準備」を参照してください。

Kubernetesリソースは、異なるネームスペースの一部にすることができます。Kubernetesクラスタ内のすべてのネームスペースを操作するには、MicroTx TCSのPeerAuthenticationポリシーを変更して、MicroTx TCSがすべてのネームスペースのサービスと通信できるようにする必要があります。

ネームスペース全体でのピア間の通信の許可

ピア認証は、Istioサービス・メッシュを使用したKubernetesクラスタでのサービス・ツー・サービス認証を提供します。詳細は、PeerAuthenticationを参照してください。

Oracle Transaction Manager for Microservices (OTMM)のPeerAuthenticationポリシーのspec.mtls.mode値を、<otmm>/helmcharts/tmm/templates/auth.yamlファイルでSTRICTからPERMISSIVEに変更します。PERMISSIVE値は、Kubernetesクラスタ内のすべてのネームスペース間の通信を容易にします。

変更前のspec.mtls.mode値:

apiVersion: "security.istio.io/v1beta1"
kind: "PeerAuthentication"
metadata:
  name: "peer-auth"
  namespace: {{ .Values.applicationNameSpace }}
spec:
  mtls:
    mode: STRICT

変更後のspec.mtls.mode値:

apiVersion: "security.istio.io/v1beta1"
kind: "PeerAuthentication"
metadata:
  name: "peer-auth"
  namespace: {{ .Values.applicationNameSpace }}
spec:
  mtls:
    mode: PERMISSIVE

ピア認証の詳細は、PeerAuthenticationを参照してください。

ルーティング・ルールの作成

ルーティング・ルールは、WebLogic Server、WebLogic Server管理コンソール、アプリケーションおよびHelidonにアクセスするために作成されます。

Istio VirtualServiceを作成して、WebLogicクラスタ、HelidonおよびTellerサービスのすべてのアプリケーションに適用されるトラフィック・ルーティング・ルールのセットを定義します。次のスクリプトの例を参照として使用できます:

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: wls-domain-virtualservice
  namespace: wls-domain-ns
spec:
  gateways:
    - otmm/otmm-gateway
  hosts:
    - '*'
  http:
    - match:
        - uri:
            prefix: /console
        - uri:
            prefix: /management
        - port: 7001
      route:
        - destination:
            host: wls-domain-admin-server
            port:
              number: 7001
 
    - match:
        - uri:
            prefix: /mtxwls
        - port: 8001
      route:
        - destination:
            host: wls-domain-cluster-cluster-1
            port:
              number: 8001
 
    - match:
        - uri:
            prefix: /mtxhelidon
        - port: 8084
      route:
        - destination:
            host: microtx-helidon.helidon-ns.svc.cluster.local
            port:
              number: 8084
 
    - match:
        - uri:
            prefix: /mtxteller
        - port: 8087
      route:
        - destination:
            host: microtx-teller.helidon-ns.svc.cluster.local
            port:
              number: 8087

Istio仮想サービス仕様の詳細は、Istioゲートウェイを参照してください。

WebLogic ServerおよびMicroTxには、独自の管理コンソールがあります。デフォルトでは、MicroTxコンソールはサポートされていません。http(s)://LoadBalancer/consoleを使用してWebLogic Server管理コンソールにアクセスすると、パスの衝突が発生します。この場合、次に示すように、<otmm>/helmcharts/tmm/templates/auth.yamlファイルにあるOracle Transaction Manager for Microservices (OTMM)認可ポリシー・ルールのnotpaths値を変更する必要があります。ただし、パスを書き換えることで、異なるURLを使用することもできます。

apiVersion: "security.istio.io/v1beta1"
kind: "AuthorizationPolicy"
metadata:
  name: "frontend-ingress"
  namespace: {{ .Values.istioSystemNameSpace }}
spec:
  selector:
    matchLabels:
      istio: {{ .Values.istioIngressGateway.name }}
  action: {{ .Values.authentication.requestsWithNoJWT }}
  rules:
    - from:
        - source:
            notRequestPrincipals: ["*"]
      to:
        - operation:
            ###########notPaths Value before change ["/console*"]######################
            notPaths: ["/mtxconsole*"]

WebLogic ServerとHelidonおよびMicroTxのアプリケーションおよびサービスとの統合の設定

MicroTxを使用すると、複雑なコードを記述することなく、マイクロサービスおよびクラウド・ネイティブ・アプリケーション間で様々なデータ一貫性を保証できます。MicroTxでは、トランザクション・プロトコルを選択し、クライアント・ライブラリに含まれるAPIおよび注釈を使用することで、Kubernetesにデプロイされたアプリケーションで分散トランザクションを簡単に使用できるようになります。この統合では、MicroTxは、HelidonおよびWebLogic Serverアプリケーションにまたがる分散XAトランザクションを調整します。

MicroTxとWebLogic Serverの統合の一環として、MicroTxはWebLogic Server介在トランザクション・マネージャ(ITM)を使用して、WebLogic Serverとのトランザクションを調整します。

WebLogic ServerドメインにデプロイされたJDBCリソース(javax.transaction.xa.XAResourceとして)がトランザクションに参加できるようにするには、MicroTxがITMを使用してWebLogic Serverとインタフェースする必要があります。WebLogic Server ITMは、weblogic.transaction.InterposedTransactionManagerインタフェースを通じて、javax.transaction.xa.XAResource実装を公開します。MicroTxトランザクション・マネージャは、InterposedTransactionManagerインタフェースにアクセスして、コミット処理時にWebLogic Serverトランザクション・マネージャのXAResourceと調整します。『Oracle WebLogic Server JTAアプリケーションの開発』サード・パーティ・トランザクション・マネージャで管理されるトランザクションへの参加に関する項を参照してください。

MicroTxバイナリをMicroTxダウンロード・ページからダウンロードし(前提条件を参照)、次のタスクを実行して、WebLogic Server、HelidonおよびMicroTxのアプリケーションおよびサービス間の統合を有効にします:

Helidon Tellerアプリケーションのビルドおよびデプロイ

Tellerアプリケーションをビルドおよびデプロイするには:
  1. 次のコマンドを使用して、<OTMM_BINARIES_EXTRACTED_PATH>/lib/java/の場所からOTMMライブラリを取得し、ローカルMavenリポジトリにインストールします:
    mvn install:install-file -Dfile=<OTMM_BINARIES_EXTRACTED_PATH>/lib/java/TmmLib-22.3.2.jar -DpomFile=<OTMM_BINARIES_EXTRACTED_PATH>/lib/java/TmmLib-22.3.2.pom

    ノート:

    次のMaven依存関係は、インストールされたOTMMライブラリを参照するために使用されます:
    <dependency>
         <groupId>com.oracle.tmm.jta</groupId>
         <artifactId>TmmLib</artifactId>
         <version>22.3.2</version>
    </dependency>
  2. Helidon TellerアプリケーションのDockerイメージを作成し、Kubernetesクラスタにデプロイします。

    MicroTxバイナリでは、Helidon Tellerアプリケーションのサンプルは、<OTMM_BINARIES_EXTRACTED_PATH>/samples/xa/java/weblogic/tellerの場所にあります。

    1. <OTMM_BINARIES_EXTRACTED_PATH>/samples/xa/java/weblogic/teller/src/main/resourcesの場所にあるapplication.yamlファイルを更新します。このファイルでは、Helidon TellerアプリケーションのエンドポイントURLを、認証の詳細(ある場合)とともに指定します。
      helidonServiceEndpoint: http://<HELIDON_APP_K8S_SERVICE_NAME>:<HELIDON_APP_K8S_SERVICE_PORT>/<HELIDON_APP_CONTEXT_PATH>
      weblogicServiceEndpoint: http://<WEBLOGIC_APP_K8S_SERVICE_NAME>:<WEBLOGIC_APP_K8S_SERVICE_PORT>/<WEBLOGIC_APP_CONTEXT_PATH>
      Weblogic:
        BasicAuth:
          UserName: <wls_username>
          Password: <wls_password>

      次に例を示します:

      helidonServiceEndpoint: http://microtx-helidon.helidon-ns.svc.cluster.local:8084/mtxhelidon
      weblogicServiceEndpoint: http://wls-domain-cluster-cluster-1.wls-domain-ns.svc.cluster.local:8001/mtxwls
      Weblogic:
        BasicAuth:
          UserName: <wls_username>
          Password: <wls_password>
    2. <OTMM_BINARIES_EXTRACTED_PATH>/samples/xa/java/weblogic/teller/src/main/resourcesの場所にあるtmm.propertiesファイルを更新します。
      ### oracle.tmm.TcsUrl value refers to the MicroTx coordinator URL
      oracle.tmm.TcsUrl = http(s)://<OTMM_K8S_SERVICE_NAME>:<OTMM_SERVICE_PORT>/api/v1
      oracle.tmm.TcsConnPoolSize = 15
      ### oracle.tmm.CallbackUrl refers to the Helidon Teller Application call-back URL along with the context path
      oracle.tmm.CallbackUrl = http://<HELIDON_TELLER_APP_K8s_SERVICE_NAME>:<HELIDON_TELLER_APP_K8s_SERVICE_NAME>/<HELIDON_TELLER_APP_CONTEXTPATH>
       
      ## Transaction Timeout Out value in milli seconds
      oracle.tmm.TransactionTimeout = 60000
       
      oracle.tmm.PropagateTraceHeaders = false

      次に例を示します:

      oracle.tmm.TcsUrl = http://otmm-tcs.otmm.svc.cluster.local:9000/api/v1
      oracle.tmm.TcsConnPoolSize = 15
      oracle.tmm.CallbackUrl = http://microtx-teller.heidon-ns.svc.cluster.local:8087/mtxteller
      oracle.tmm.TransactionTimeout = 60000
      oracle.tmm.PropagateTraceHeaders = false
    3. Tellerディレクトリに移動し、Dockerイメージを作成します:
      cd <OTMM_BINARIES_EXTRACTED_PATH>/samples/xa/java/weblogic/teller
      docker build -t <IMAGE_NAME>
    4. イメージをタグ付けしてコンテナ・レジストリにアップロードし、Kubernetesポッドでイメージを参照します。次のコマンドを使用して、イメージをタグ付けしてアップロードします:
      docker tag <IMAGE_NAME> <CONTAINER_REGISTRY>:<IMAGE_NAME>
      docker push <CONTAINER_REGISTRY>:<IMAGE_NAME>

Helidon参加側アプリケーションのビルドおよびデプロイ

参加側アプリケーションをビルドおよびデプロイするには:
  1. 次のコマンドを使用して、<OTMM_BINARIES_EXTRACTED_PATH>/lib/java/の場所からOTMMライブラリを取得し、ローカルMavenリポジトリにインストールします:
    mvn install:install-file -Dfile=<OTMM_BINARIES_EXTRACTED_PATH>/lib/java/TmmLib-22.3.2.jar -DpomFile=<OTMM_BINARIES_EXTRACTED_PATH>/lib/java/TmmLib-22.3.2.pom

    ノート:

    次のMVN依存関係は、インストールされたOTMMライブラリを参照するために使用されます:
    <dependency>
         <groupId>com.oracle.tmm.jta</groupId>
         <artifactId>TmmLib</artifactId>
         <version>22.3.2</version>
    </dependency>
  2. Helidon参加側アプリケーションのDockerイメージを作成し、Kubernetesクラスタにデプロイします。

    MicroTxバイナリでは、Helidon参加側アプリケーションのサンプルは、<OTMM_BINARIES_EXTRACTED_PATH>/samples/xa/java/weblogic/helidon-appの場所にあります。

    1. <OTMM_BINARIES_EXTRACTED_PATH>/samples/xa/java/weblogic/helidon-app/src/main/resourcesの場所にあるapplication.yamlファイルを更新します。このファイルで、Helidon参加側アプリケーションのデータベースXA接続の詳細を指定します。

      ノート:

      このapplication.yamlファイルでは、ローカル・データ・ソースorclがアプリケーション・コードで参照されます。別のデータ・ソースを使用する場合は、アプリケーション・コード内の名前も変更する必要があります。
      oracle:
        ucp:
          jdbc:
            PoolXADataSource:
              localOrcl:
                URL: jdbc:oracle:thin:@127.0.0.1:1521/orcl
                connectionFactoryClassName: oracle.jdbc.xa.client.OracleXADataSource
                user: <db-username>
                password: <db-password>
    2. <OTMM_BINARIES_EXTRACTED_PATH>/samples/xa/java/weblogic/helidon-app/src/main/resourcesの場所にあるtmm.propertiesファイルを更新します。
      ### oracle.tmm.TcsUrl value the MicroTx coordinator URL
      oracle.tmm.TcsUrl = http(s)://<OTMM_K8S_SERVICE_NAME>:<OTMM_SERVICE_PORT>/api/v1
      oracle.tmm.TcsConnPoolSize = 15
      ### oracle.tmm.CallbackUrl refers to the Helidon Teller Application call-back URL along with context path
      oracle.tmm.CallbackUrl = http://<HELIDON_PARTICIPANT_APP_K8s_SERVICE_NAME>:<HELIDON_PARTICIPANT_APP_K8s_SERVICE_PORT>/<HELIDON_PARTICIPANT_APP_CONTEXTPATH>
      ##RM Id
      oracle.tmm.xa.<rmid> = HELIDON-TX-RM-ID-FOR-MICROTX-TESTS

      次に例を示します:

      oracle.tmm.TcsUrl = http://otmm-tcs.otmm.svc.cluster.local:9000/api/v1
      oracle.tmm.TcsConnPoolSize = 15
      oracle.tmm.CallbackUrl = http://microtx-helidon.helidon-ns.svc.cluster.local:8084/mtxhelidon
      # Resource Manager(RM) Unique Id. Make sure to replace the id value with the RM used in the application
      oracle.tmm.xa.rmid = HELIDON-TX-RM-ID-FOR-MICROTX-TESTS
    3. Dockerfileの場所に移動し、Dockerイメージを作成します:
      cd <OTMM_BINARIES_EXTRACTED_PATH>/samples/xa/java/weblogic/helidon-app
      docker build -t <IMAGE_NAME>
    4. イメージをタグ付けしてコンテナ・レジストリにアップロードし、Kubernetesポッドでイメージを参照します。次のコマンドを使用して、イメージをタグ付けしてアップロードします:
      docker tag <IMAGE_NAME> <CONTAINER_REGISTRY>:<IMAGE_NAME>
      docker push <CONTAINER_REGISTRY>:<IMAGE_NAME>

WebLogic ServerドメインでのMicroTxアプリケーションWARファイルのビルドおよびデプロイ

WebLogic ServerのアプリケーションWAR (Webアプリケーション・リソースまたはWebアプリケーション・アーカイブ)ファイルをビルドし、そのファイルをWebLogicクラスタまたは管理対象サーバー・リソースにターゲット指定するには:

  1. アプリケーションに必要なデータベース・リソース(データベース・ユーザー、表、ビューなど)を作成します。
  2. WebLogic Serverで、現在のアプリケーションで使用される必要なXAおよび非XAのJDBCデータ・ソースを作成します。
  3. JDBC TLogストアのデータ・ソース(非XAデータ・ソース)を作成してデプロイします。WebLogic永続ストアの管理JDBCストアの使用 を参照してください。このデータ・ソースのJTAトランザクション・ログ・ストア属性を設定します。データ・ソースをWebLogicクラスタにターゲット指定します。
  4. TmmLibライブラリをローカルMavenリポジトリに追加します。このライブラリは、<OTMM_BINARIES_EXTRACTED_PATH>/lib/java/の場所にあります。
  5. 次のコマンドを使用して、OTMMライブラリをローカルMavenリポジトリにインストールします:
    mvn install:install-file -Dfile=<OTMM_BINARIES_EXTRACTED_PATH>/lib/java/TmmLib-22.3.2.jar -DpomFile=<OTMM_BINARIES_EXTRACTED_PATH>/lib/java/weblogic/TmmLib-weblogic-22.3.2.pom

    ノート:

    次のMVN依存関係は、インストールされたOTMMライブラリを参照するために使用されます:
    <dependency>
         <groupId>com.oracle.tmm.jta</groupId>
         <artifactId>TmmLib</artifactId>
         <version>22.3.2</version>
    </dependency>
  6. WebLogic Serverのアプリケーションをビルドします。

    サンプルのWebLogic Serverアプリケーションは、JAX-RSベースのWebアプリケーションです。このサービスはトランザクションに参加します。そのため、XA参加側サービスとも呼ばれます。必要なビジネス・ロジックを提供し、Oracleデータベース(RDBMS)をリソース・マネージャとして使用します。

    サンプル・アプリケーションは、<OTMM_BINARIES_EXTRACTED_PATH>/samples/xa/java/weblogic/weblogic-jaxrs-appの場所にあります。このサンプルは、独自のアプリケーションをビルドする際の参照として使用できます。

    1. MicroTx TCS構成ファイル(<OTMM_BINARIES_EXTRACTED_PATH>/samples/xa/java/weblogic/weblogic-jaxrs-app/src/main/resourcesの場所にあるtmm.properties)を更新します。
      ### oracle.tmm.TcsUrl value refer to OTMM Service URL
      oracle.tmm.TcsUrl = http(s)://<OTMM_K8S_SERVICE_NAME>:<OTMM_K8S_SERVICE_PORT>/api/v1
      oracle.tmm.TcsConnPoolSize = 15
      ### oracle.tmm.CallbackUrl refers to weblogic application callback URL along with context path
      oracle.tmm.CallbackUrl = http://<WEBLOGIC_APP_K8S_SERVICE_NAME>:<WEBLOGIC_APP_K8S_SERVICE_PORT>/<WEBLOGIC_APP_CONTEXT_PATH> 
      ### WebLogic Name Space. This is mandatory for WebLogic Apps. We are using this to derive the WLS Managed Server Name to maintain Tx affinity
      oracle.tmm.WeblogicNamespace = <WLS_DOMAIN_NAME_SPACE>
       
      ### Resource Manager(RM) Unique Id. Make sure to replace the id value with the RM used in the application
      oracle.tmm.xa.<rmid> = DEPT-JPA-0DE1-453C-B872-291FDBF49CFF
      oracle.tmm.UseApacheConnectorProvider=false
      ### oracle.tmm.WeblogicTxnSupport should be set to true for WebLogic MicroTx Applications
      oracle.tmm.WeblogicTxnSupport = true

      たとえば、次のtmm.propertiesファイルのサンプルを使用して、KubernetesにデプロイされたWebLogicクラスタを操作します。ここで、MicroTxアプリケーションはWebLogicクラスタにデプロイされ、クラスタURL 'http://wls-domain-cluster-cluster-1.wls-domain-ns.svc.cluster.local:8001/mtxwls/'を使用してアクセスされます。このサンプルで使用されるWebLogic Serverドメイン・ネームスペースは、wls-domain-nsです。

      oracle.tmm.TcsUrl = http://otmm-tcs.otmm.svc.cluster.local:9000/api/v1
      oracle.tmm.TcsConnPoolSize = 15
      oracle.tmm.CallbackUrl = http://wls-domain-cluster-cluster-1.wls-domain-ns.svc.cluster.local:8001/mtxwls
      oracle.tmm.WeblogicNamespace = wls-domain-ns
      # Resource Manager(RM) Unique Id. Make sure to replace the id value with the RM used in the application
      oracle.tmm.xa.Rmid = WLS-TX-RM-ID-FOR-MICROTX-TESTS
      oracle.tmm.UseApacheConnectorProvider=false
      oracle.tmm.WeblogicTxnSupport = true
    2. 次のコマンドを使用して、プロジェクトをビルドします:
      mvn clean package -DskipTests=true
    3. 生成されたWebLogic Server JAX-RS WebアプリケーションWARファイル(MicroTxライブラリを含む)をWebLogicクラスタにデプロイします。「イメージ内のモデル」パターンを使用している場合、WDTを使用してアプリケーションをデプロイします。「PV上のドメイン・ホーム」パターンを使用している場合、WLSTまたはWebLogic Server管理コンソールを使用してアプリケーションをデプロイできます。

ノート:

独自のJAX-RSアプリケーションを操作する場合は、次のpom依存関係およびjavax.ws.rs.core.ApplicationサブクラスをJAX-RSアプリケーションに追加してください。ただし、アプリケーションでWebLogicデータ・ソース接続を使用する必要があります。

次に示すこの依存関係は、ローカルMavenリポジトリから参照されます。したがって、プロジェクトをパッケージ化する前に、このアーティファクトリをローカルMavenリポジトリに追加する必要があります。

<dependency>
   <groupId>com.oracle.tmm.jta</groupId>
   <artifactId>TmmLib</artifactId>
   <version>22.3.2</version>
</dependency>

また、javax.ws.rs.core.Applicationサブクラスを追加して、@Providerおよび@Pathの注釈が付いたすべてのリソース・クラスをスキャンします。このサブクラスは、MicroTxフィルタ・クラス、コールバック・リソースおよび接続ファクトリ・クラスを登録するために必要です。

javax.ws.rs.core.Applicationサブクラス・メソッド'getClasses()'または'getSingletons()'は、関連するJAX-RSリソースおよびプロバイダを返します。getClasses()メソッドとgetSingletons()メソッドの両方で空のセットが返される場合、アプリケーションで見つかったすべてのJAX-RSリソースおよびプロバイダ・クラスがJAX-RSアプリケーション・サブクラスに追加されます。

package com.oracle.mtm.sample;
 
import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;
 
@ApplicationPath("/")
public class WebLogicWebApp extends Application {
}

WebLogic Deploy Toolingを使用したWebLogicクラスタへのWebアプリケーションのデプロイ

次のスクリプト例は、WDTを使用してWebLogicクラスタにWebLogic Server JAX-RS WebアプリケーションWARファイルをデプロイするために使用します:

appDeployments:
    Application:
        mtxwwls :
            SourcePath: wlsdeploy/applications/mtxwls.war
            Target: cluster-1
            ModuleType: war

MicroTxコーディネータ・サービスのデプロイ

MicroTxコーディネータ・サービスをデプロイする前に、Istioサービス・メッシュをKubernetesクラスタにデプロイしたことを確認します。

MicroTxコーディネータ・サービスをデプロイするには:

  1. OTMMのhelmchartsディレクトリに移動します:
    cd <OTMM_BINARIES_EXTRACTED_PATH>/otmm/helmcharts/tmm
  2. values.yamlファイルで次のプロパティを変更します。
    • tmmReplicaCount: デフォルトでは、この値は1に設定されています。要件に応じて、この数を変更します。
    • tmmImage: デフォルトでは、この値はtmm:22.3.xに設定されています。OTMMイメージのURLを使用する必要があります。
    • tmmExternalURL (tmmConfigurationセクション内): ホストおよびポートの詳細を更新します。ホスト値は、IstioのパブリックIPまたはホストの名前である必要があります。ポート値は、Istioに関連付けられたSSLポートまたは非SSLポートに設定する必要があります。
    • xaCoordinator.enabled (tmmConfigurationセクション内): XAトランザクションの場合、このプロパティをtrueに設定します。
    • storage.type (tmmConfigurationセクション内): デフォルトでは、記憶域タイプはmemoryに設定されます。HAにdbを使用することをお薦めします。
    • データベース接続の詳細(tmmConfigurationセクション内): 記憶域タイプがdbに設定されている場合、これらの詳細を更新します。
  3. 次のコマンドを使用して、OTMMネームスペースを作成し、OTMM Helmchartをインストールします:
    cd <OTMM_BINARIES_EXTRACTED_PATH>/helmcharts
    kubectl create ns otmm
    kubectl label namespace otmm istio-injection=enabled
    helm install otmm --namespace otmm tmm --values ./tmm/values.yaml

values.yamlファイルのいくつかのサンプル:

  • ファイルのtmmImageセクションの構成値のサンプル(ローカル・コンテナ・レジストリからイメージを格納および参照するのではなく、Oracle Container RegistryからtmmImageイメージを参照できます):

    tmmImage:
      image: <Image_Registry>/tmm:22.3.x
      imagePullPolicy: Always
      imagePullSecret: regcred
  • ファイルのtmmConfigurationセクションにあるtmmExternalURLxaCoordinatorおよびstorage.typeプロパティの構成値のサンプル:

    tmmConfiguration:
      tmmId: "TCS01"
      tmmAppName: otmm-tcs
      port: 9000
      tmmExternalURL:
        protocol: http
        host: x.x.x.x
        port: 80
     
      xaCoordinator:
        enabled: "true"
        txMaxTimeout: 600000
      lraCoordinator:
        enabled: "false"
      tccCoordinator:
        enabled: "false"
     
      storage:
        type: db
        db:
          connectionString: "tcps://<ORACLE_DB_HOST>:<ORACLE_DB_PORT>/<ORACLE_DB_SERVICE>?retry_count=20&retry_delay=3"
          credentialSecretName: "walletsecret"
          connectionParams: ""
          walletConfigMap:
            configMapName: "db-wallet-cmap"
        completedTransactionTTL: 60
     
      # Sample configuration values for Retry settings
      #The maximum number of times the TMM (Transaction Coordinator) will retry an operation in case of certain failures
      maxRetryCount: 10
      #The minimum retry interval in milliseconds
      minRetryInterval: 1000
      #The maximum retry interval in milliseconds
      maxRetryInterval: 10000
      # Coordinator HTTP client timeout value in seconds. A Timeout of zero means no timeout. Max allowed value is 900 seconds
      httpClientTimeoutInSecs: 180

ノート:

デフォルトでは、OTMMコーディネータ・サービスのhttpClientTimeoutInSecs値は180秒に設定されます。このタイムアウトは、OTMMコーディネータ・サービスがトランザクション参加側と通信してトランザクションを完了するときに考慮されます。この値は、values.yamlの他の再試行設定パラメータとともに使用されます。

一般的な問題のトラブルシューティング

MicroTxを使用したWebLogic ServerとHelidonの統合の設定時に発生する可能性がある一般的な問題について学習します。

問題1

Helidonアプリケーションでは、JAX-RS実装によって提供されるjavax.ws.rs.core.Applicationクラスを拡張することでアプリケーション・コンテキスト・パスが定義されると、XA接続が失敗し、エラーが報告されます。エラー・メッセージのサンプルを次に示します:

2023.03.17 11:39:16 WARNING io.helidon.microprofile.server.JaxRsCdiExtension
!thread!: Internal server error java.lang.NullPointerException
        at oracle.tmm.jta.common.TrmConnectionFactory.getXAConn(TrmConnectionFactory.java:47)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAcc essorImpl.java:62)
. . . .

次のサンプル・コードは、報告される例外を示しています(javax.ws.rs.core.Applicationを拡張してHelidonアプリケーション/コンテキスト・パスを作成した後):

package com.oracle.mtm.sample.resource;
 
import java.util.Set;
 
import javax.enterprise.context.ApplicationScoped;
import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;
 
//Adding Application Context path by extending javax.ws.rs.core.Application
@ApplicationScoped
@ApplicationPath("/helidonapp")
public class HelidonApplication extends Application {
    @Override
    public Set<Class<?>> getClasses() {
        return Set.of(AccountsResource.class);
    }
}

解決策:

次に示すように、org.glassfish.jersey.server.ResourceConfigを拡張してアプリケーション/コンテキスト・パスを作成します:

package com.oracle.mtm.sample.resource;
 
import java.util.Set;
 
import javax.enterprise.context.ApplicationScoped;
import org.glassfish.jersey.server.ResourceConfig;
import javax.ws.rs.ApplicationPath;  
 
//Adding Application Context path by extending org.glassfish.jersey.server.ResourceConfig
@ApplicationPath("/helidonapp")
public class HelidonApplication extends ResourceConfig {
}

問題2

Helidon Tellerアプリケーションがトランザクション制限エラーを報告します。エラー・メッセージのサンプルを次に示します:

2023.04.10 06:03:05 INFO TMMLibDefaultLogger !thread!: begin response from TCS: transaction limit error. Reached total allowed transactions count of 4800. Please try after one hour
---429
2023.04.10 06:03:05 WARNING io.helidon.microprofile.server.JaxRsCdiExtension !thread!: Internal server error
javax.transaction.SystemException: transaction limit error. Reached total allowed transactions count of 4800. Please try after one hour
 
        at oracle.tmm.jta.TrmUserTransaction.begin(TrmUserTransaction.java:183)
        at oracle.tmm.jta.TrmUserTransaction.begin(TrmUserTransaction.java:124)
        at oracle.tmm.jta.transactional.TrmTransactionalRequired.intercept(TrmTransactionalRequired.java:51)
. . . .
. . . .

解決策:

MicroTx Freeリリース22.3.1以前には、1時間当たりに許可されるトランザクション数に制限があります。この制限を削除するには、MicroTx Free 22.3.2以降を使用します。

問題3

データベースで正しい権限が付与されていない場合、トランザクションをリカバリしようとすると、HelidonおよびWebLogic Serverはエラー(XAER_RMERRエラー)を報告します。エラー・メッセージのサンプルを次に示します:

2023.05.02 11:47:09 SEVERE TMMLibDefaultLogger !thread!: RMID : <RMID> XA Exception:  XAErr: -3 XAErrString: XAER_RMERR
javax.transaction.xa.XAException
        at oracle.jdbc.xa.OracleXAResource.recover(OracleXAResource.java:754)
        at oracle.tmm.jta.common.TrmXAResource.xaop(TrmXAResource.java:225)
. . . .

解決策:

HelidonおよびWebLogicデータベース・ユーザーに次のデータベース権限を指定します:

GRANT SELECT ON sys.dba_pending_transactions TO <DB_USERNAME>;
GRANT SELECT ON sys.dba_2pc_pending TO <DB_USERNAME>;
GRANT EXECUTE ON sys.dbms_xa TO <DB_USERNAME>;
GRANT FORCE ANY TRANSACTION TO <DB_USERNAME>;