第4章 トランザクションの監視

4.1. Transactions サブシステムのロギング設定

JBoss EAP の他のログ設定に依存せずにログに記録されたトランザクションに関する情報の量を制御できます。ログ設定は、管理コンソールまたは管理 CLI を使用して設定できます。

管理コンソールを使用したトランザクションロガーの設定

  1. Logging サブシステム設定に移動します。

    1. 管理コンソールで、Configuration タブをクリックします。管理対象ドメインを使用する場合は、適切なサーバープロファイルを選択する必要があります。
    2. SubsystemsLoggingConfiguration と選択し、表示 をクリックします。
  2. com.arjuna 属性を編集します。

    Categories タブを選択します。com.arjuna エントリーがすでに存在します。com.arjuna を選択し、編集 をクリックします。ログレベルを変更し、親ハンドラーを使用するかどうかを選択できます。

    • ログレベル:

      トランザクションにより大量のロギング出力が生成されることがあるため、サーバーのログがトランザクション出力で満たされないようデフォルトのロギングレベルは WARN に設定されます。トランザクション処理の詳細を確認する必要がある場合は、トランザクション ID が表示されるよう TRACE ログレベルを使用します。

    • 親ハンドラーの使用:

      親ハンドラーはロガーが出力を親ロガーに送信するかどうかを指定します。デフォルトの動作は true です。

  3. 保存 をクリックして変更を保存します。

管理 CLI を使用したトランザクションロガーの設定

以下のコマンドを使用して管理 CLI からログレベルを設定します。スタンドアロンサーバーの場合は、コマンドから /profile=default を削除します。

/profile=default/subsystem=logging/logger=com.arjuna:write-attribute(name=level,value=VALUE)

4.1.1. TRACE ログレベルの有効化

TRACE ロギングレベルはログにデータを追加して、JBoss EAP で Jakarta コネクターの問題を診断できるようにします。以下の手順は、org.jboss.jcaorg.jboss.as.connector、および com.arjuna クラスの TRACE レベルのロギングを有効にする方法を示しています。

前提条件

  • JBoss EAP がインストールされている。

手順

  1. 端末を開きます。
  2. 管理 CLI を起動します。
  3. 以下のいずれかのオプションを選択します。

    • 管理対象ドメインで、org.jboss.jcaorg.jboss.as.connectorcom.arjuna クラスの TRACE ロギングレベルを有効にするには、以下のコマンドを使用します。

      /profile=<PROFILE NAME>/subsystem=logging/logger=org.jboss.jca:add(level=TRACE)
      /profile=<PROFILE NAME>/subsystem=logging/logger=org.jboss.as.connector:add(level=TRACE)
      /profile=<PROFILE NAME>/subsystem=logging/logger=com.arjuna:write-attribute(name=level,value=TRACE)

      <PROFILE NAME> を JBoss EAP プロファイル (defaultfull、または full-ha) に置き換えます。

    • JBoss EAP をスタンドアロンサーバーとして実行する場合に、org.jboss.jcaorg.jboss.as.connectorcom.arjuna クラスの TRACE ロギングレベルを有効にするには、以下のコマンドを使用します。

      /subsystem=logging/logger=org.jboss.jca:add(level=TRACE)
      /subsystem=logging/logger=org.jboss.as.connector:add(level=TRACE)
      /subsystem=logging/logger=com.arjuna:write-attribute(name=level,value=TRACE)

      必要に応じて、次のコマンドを使用して、console-handler クラスで TRACE ログレベルを有効にします。

      /subsystem=logging/console-handler=CONSOLE:write-attribute(name=level,value=TRACE)

      コードスニペットは、適切な設定ファイルに追加されます。

      <logger category="com.arjuna">
        <level name="TRACE"/>
      </logger>
      
      <logger category="org.jboss.jca">
        <level name="TRACE"/>
      </logger>
      <logger category="org.jboss.as.connector">
        <level name="TRACE"/>
      </logger>

4.1.2. トランザクションブリッジロガーの有効化

トランザクションブリッジは XTS 上の層で、Transaction Manager の Jakarta Transactions または JTS コンポーネントの上にレイヤーです。これは JBoss EAP サーバーの他のコンポーネントと対話します。システムの操作の詳細を知るために、トランザクションマネージャーと対話するコンポーネントの詳細ロギングを有効することができます。

トランザクションブリッジは logging サブシステムを使用します。JBoss EAP サーバーの実行時、ロギングは standalone-xts.xml ファイルの logging サブシステム設定によって設定されます。トランザクションブリッジのロギングは、デバッグを行うときに便利です。

以下の管理 CLI コマンドを使用すると、org.jboss.jbossts.txbridge ロガーを設定し、トランザクションブリッジのロギングを有効にすることができます。

/subsystem=logging/logger=org.jboss.jbossts.txbridge:add(level=ALL)

これにより、サーバー設定ファイルに以下の XML が作成されます。

<logger category="org.jboss.jbossts.txbridge">
  <level name="ALL" />
</logger>
注記

デプロイメントの順番の問題により、logging サブシステムが完全に設定される前に、トランザクションブリッジを含むトランザクションマネージャーのコンポーネントがアクティブになることがあります。このような場合、デフォルトのロギングレベルが起動中に適用されるため、詳細なデバッグメッセージは出力されません。

以下の管理 CLI コマンドを使用すると、com.arjuna ロガーを設定し、詳細なロギングを有効にすることができます。

/subsystem=logging/logger=com.arjuna:write-attribute(name=level,value=ALL)

これにより、サーバー設定ファイルに以下の XML が作成されます。

<logger category="com.arjuna">
  <level name="ALL" />
</logger>

4.1.3. トランザクションログメッセージ

トランザクションロガーに DEBUG ログレベルを使用することにより、ログファイルを読み取り可能な状態に保ちつつトランザクションを追跡できます。詳細なデバッグの場合は、TRACE ログレベルを使用します。トランザクションロガーの設定に関する詳細については、Transactions サブシステムのロギング設定 を参照してください。

TRACE ログレベルでログを記録するよう設定すると、トランザクションマネージャー (TM) は多くのロギング情報を生成できます。最も一般的なメッセージの一部は次のとおりです。このリストは包括的ではなく、他のメッセージが表示されることもあります。

表4.1 トランザクション状態の変更

トランザクションの開始

トランザクションが開始されたら、クラス com.arjuna.ats.arjuna.coordinator.BasicAction のメソッド Begin が実行され、メッセージ BasicAction::Begin() for action-id <transaction uid> でログに示されます。

トランザクションのコミット

トランザクションがコミットされたら、クラス com.arjuna.ats.arjuna.coordinator.BasicAction のメソッド Commit が実行され、メッセージ BasicAction::Commit() for action-id <transaction uid> でログに示されます。

トランザクションのロールバック

トランザクションがロールバックされたら、クラス com.arjuna.ats.arjuna.coordinator.BasicAction のメソッド Rollback が実行され、メッセージ BasicAction::Rollback() for action-id <transaction uid> でログに示されます。

トランザクションのタイムアウト

トランザクションがタイムアウトすると、com.arjuna.ats.arjuna.coordinator.TransactionReaper のメソッド doCancellations が実行され、Reaper Worker <thread id> attempting to cancel <transaction uid> とログに示されます。この結果、上記のように同じスレッドがトランザクションをロールバックすることが示されます。

4.1.4. トランザクションログファイルのデコード

4.1.4.1. トランザクションの XID/UID の特定

javax.transaction.TransactionManager インターフェイスは、トランザクション識別子を見つける方法を 2 つ提供します。

  • toString メソッドを呼び出すと、識別子を含むトランザクションに関する完全な情報を出力することができます。
  • この代わりに、javax.transaction.Transaction インスタンスを com.arjuna.ats.jta.transaction.Transaction にキャストし、ArjunaCore Uid を返す get_uid メソッドまたはブランチ識別子でないグローバル識別子の Xid を返す getTxId メソッドのいずれかを呼び出します。

    com.arjuna.ats.jta.transaction.Transaction arjunaTM = (com.arjuna.ats.jta.transaction.Transaction)tx.getTransaction();
    System.out.println("Transaction UID" +arjunaTM.get_uid());

4.1.4.2. トランザクション状態とリソースの特定

TransactionStatusConnectionManager

TransactionStatusConnectionManager オブジェクトは、トランザクションの状態を取得するためにリカバリーモジュールによって使用されます。これは、アプリケーションプロセスで TransactionStatusManager オブジェクトに接続する TransactionStatusConnector オブジェクトのテーブルを維持することで、TransactionStatusManager オブジェクトのプロキシーのように動作します。

トランザクション Uid とトランザクションタイプ (ある場合) をパラメーターとして取る getTransactionStatus メソッドを使用すると、トランザクションの状態を取得することができます。

  1. トランザクション Uid パラメーターのプロセス Uid フィールドは、トランザクションオブジェクトストアで目的の TransactionStatusManagerItem のホストとポートのペアを検索するために使用されます。
  2. ホストとポートのペアは、TransactionStatusConnector オブジェクトを使用して目的の TransactionStatusManager オブジェクトへの TCP 接続を確立するために使用されます。
  3. トランザクションの状態を取得するため、TransactionStatusConnector はトランザクション Uid とトランザクションタイプを TransactionStatusManager に渡します。

以下のコード例は、TransactionStatusConnectionManager を取得し、トランザクションの状態をチェックする方法を表しています。

// Transaction id
Uid tx = new Uid();
. . . .
TransactionStatusConnectionManager tscm = new TransactionStatusConnectionManager();

// Check if the transaction aborted
assertEquals(tscm.getTransactionStatus(tx), ActionStatus.ABORTED);
TransactionStatusManager

TransactionStatusManager オブジェクトはリカバリーマネージャーのインターフェイスとして動作し、実行中のアプリケーションプロセスからトランザクションの状態を取得します。com.arjuna.ats.arjuna.coordinator.TxControl クラスによって、アプリケーションプロセスごとに 1 つの TransactionStatusManager が作成されます。TCP 接続は、リカバリーマネージャーと TransactionStatusManager との間の対話に使用されます。デフォルトでは、すべての空きポートが TransactionStatusManager によって使用されます。ただし、使用されるポートは、以下のプロパティーを使用して修正できます。

$ EAP_HOME/bin/standalone.sh -DRecoveryEnvironmentBean.transactionStatusManagerPort=NETWORK_PORT_NUMBER
  1. 作成時、TransactionStatusManagerTransactionStatusManagerItem としてオブジェクトストアのホストと格納されるポートを取得します。
  2. Listener スレッドが開始され、TransactionStatusConnector からの接続リクエストを待ちます。
  3. 接続が確立されると、AtomicActionStatusService サービスを実行する Connection スレッドが作成されます。このサービスは、TransactionStatusConnector オブジェクトからトランザクション Uid およびトランザクションタイプ (ある場合) を受け入れます。
  4. トランザクションの状態はローカルトランザクションテーブルから取得され、TransactionStatusConnector オブジェクトに返されます。

4.1.4.3. トランザクション履歴の表示

デフォルトでは、トランザクションサービスはトランザクションに関する履歴を維持しません。作成されたトランザクションの数と作成された各トランザクションの結果に関する情報をトランザクションサービスが維持するようにするには、CoordinatorEnvironmentBean.enableStatistics プロパティー変数を true に設定します。

以下の管理 CLI コマンドを使用して、統計を有効にします。

/subsystem=transactions:write-attribute(name=enable-statistics,value=true)

プログラムを使用してより詳細なトランザクション統計を取得するには、com.arjuna.ats.arjuna.coordinator.TxStats クラスを使用します。

TxStats クラスの例

public class TxStats
{
    /**
     * @return the number of transactions (top-level and nested) created so far.
     */

    public static int numberOfTransactions();

    /**
     * @return the number of nested (sub) transactions created so far.
     *

     public static int numberOfNestedTransactions();

     /**
     * @return the number of transactions which have terminated with heuristic
     *         outcomes.
     */

    public static int numberOfHeuristics();
    /**
     * @return the number of committed transactions.
     */

    public static int numberOfCommittedTransactions();

    /**
     * @return the total number of transactions which have rolled back.
     */

    public static int numberOfAbortedTransactions();

    /**
     * @return total number of inflight (active) transactions.
     */

    public static int numberOfInflightTransactions ();

    /**
     * @return total number of transactions rolled back due to timeout.
     */

    public static int numberOfTimedOutTransactions ();
    /**
     * @return the number of transactions rolled back by the application.
     */

    public static int numberOfApplicationRollbacks ();

    /**
     * @return number of transactions rolled back by participants.
     */

    public static int numberOfResourceRollbacks ();

    /**
     * Print the current information.
     */

    public static void printStatus(java.io.PrintWriter pw);
}

com.arjuna.ats.arjuna.coordinator.ActionManager クラスは、現在アクティブなトランザクションのリストを返す getNumberOfInflightTransactions メソッドを使用して、特定のアクティブなトランザクションに関する詳細を提供します。