グローバル作業単位の有効期限切れ

キュー・マネージャーは、一定の非アクティブ間隔の後にグローバル作業単位を期限切れにするように構成することができます。

外部トランザクション・マネージャー・ソフトウェアに、そのアプリケーションによって開始されたすべてのトランザクションを最初に完了せずに終了する問題がある場合は、有効期限スキャンを有効にする必要があります。

有効期限スキャンを有効にするには、キュー・マネージャーを開始する環境で以下の変数を設定します。
  • AMQ_TRANSACTION_EXPIRY_RESCAN=再スキャン間隔 (ミリ秒)
  • AMQ_XA_TRANSACTION_EXPIRY=タイムアウト間隔 (ミリ秒)
Linux および AIXの場合の例:
# Scan runs every 30 seconds.
# Value is given in milliseconds.
export AMQ_TRANSACTION_EXPIRY_RESCAN=30000

# Transactions of age 60 seconds in the Idle state are regarded as expired.
# Value is given in milliseconds.
export AMQ_XA_TRANSACTION_EXPIRY=60000
Windows の場合の例:
rem Scan runs every 30 seconds.
rem Value is given in milliseconds.
set AMQ_TRANSACTION_EXPIRY_RESCAN=30000

rem Transactions of age 60 seconds in the Idle state are regarded as expired.
rem Value is given in milliseconds.
set AMQ_XA_TRANSACTION_EXPIRY=60000
注: 有効期限切れのスキャンは 、The OPEN GroupXA仕様の表6-4でアイドル状態にある外部のTransaction Managerソフトウェアによって開始された取引のみに影響します。

アイドル状態のトランザクションはどのアプリケーション・スレッドにも関連付けられておらず、外部トランザクション・マネージャー・ソフトウェアは、トランザクションを準備済み状態にするために xa_prepare 関数呼び出しをまだ呼び出していません。

外部トランザクション・マネージャー・ソフトウェアが異常終了して再始動した場合、通常はこの状態のトランザクションに対して「コミット」または「ロールバック」は配信されません。

以下の場合、キュー・マネージャーは、Idle 状態に達したトランザクション内で実行された Puts および Get をロールバックします。
  • キュー・マネージャーを再始動する。
  • 有効期限スキャンを有効にすると、指定された経過時間より古いアイドル・トランザクションが検出されます。

AMQ_XA_TRANSACTION_EXPIRY を設定して、アプリケーションがトランザクション内で作業を実行してからトランザクションを完了するまでの予想される間隔を考慮します。

AMQ_TRANSACTION_EXPIRY_RESCAN 値を AMQ_XA_TRANSACTION_EXPIRY 値より小さい値に設定します。 これを行うのは、トランザクション・リストのスキャンが AMQ_XA_TRANSACTION_EXPIRY 間隔内で複数回発生するようにするためです。

有効期限スキャンを有効にする必要があるかどうかを決定する方法

有効期限スキャンが必要になるのは、外部トランザクション・マネージャーがあり、そのトランザクションがアイドル・トランザクションを完了せずに終了または異常終了した場合のみです。

この方法で外部トランザクション・マネージャーが終了した場合、キュー・マネージャーを再始動するか、有効期限スキャンを構成していない限り、アプリケーションの Puts および Get of メッセージはコミットもロールバックもされません。

この状態のトランザクションがある場合、 dspmqtrn -m QMNAME -q -a の出力には、以下の例のような出力が含まれます。 これが問題のトランザクションであることを確認するために、注意すべき点がいくつかあります。
  • TRANSTATE は ACTIVE であり、PREPARED ではありません。
  • タイム・スタンプは、 dspmqtrnを実行する前にトランザクションが長時間開始されたことを示しています。 タイム・スタンプが最新の場合、これは問題のトランザクションではありません。
  • EXTURID は、XA_FORMATID、XA_GTRID、および XA_BQUAL の値が空でないため、これが XA トランザクションであることを示しています。
  • OBJECT レコードとして 1 つ以上のアプリケーション・キュー名がリストされており、このトランザクションの下でこれらのキューに対して Puts または Get が実行されたことを示しています。
  • アプリケーションが接続されなくなったため、このレコードにはライブ接続情報 (例えば、CONN、PID、TID、APPLTAG、USERID) がありません。
TranNum(0,513)
   TRANSTATE(ACTIVE)
   UOWLOGDA(2024-05-23) UOWLOGTI(17.03.22)
   UOWSTDA(2024-05-23)  UOWSTTI(17.03.22)
   UOWLOG( )
   EXTURID(XA_FORMATID[WASD] XA_GTRID[0000018] XA_BQUAL[0000018])
   OBJECT(MY.QUEUE                                        )