グローバルトランザクションのトランザクションタイムアウトの監視時間は、不要となったトランザクションを回収することでシステム資源を回収する機能です。
グローバルトランザクションのタイムアウト時間は、データベース連携サービスのconfigファイル(TRAN_TIME_OUT)、またはset_timeoutメソッドを使用して設定します。configファイルの設定方法については、“チューニングガイド”の“データベース連携サービスの環境定義”-“configファイル”を参照してください。set_timeoutメソッドについては、“リファレンスマニュアル(API編)”の“Currentインタフェース”を参照してください。
イベントデータの受信処理も、グローバルトランザクションのトランザクションタイムアウトの監視対象になります。イベントデータの受信処理は、イベントデータが存在しない場合は待ち状態になりますが、その時間もトランザクションタイムアウトの監視時間に含まれます。
したがって、ローカルトランザクションと同様、pullの待ち時間が長い場合は、トランザクションタイムアウトが発生します。
タイムアウトの発生を防止するためには、ES_ChannelUtil_pull_wait()でデータの受信を検出後、トランザクションを開始することで回避することができます。
ES_ChannelUtil_pull_wait()を使用した際の動作を以下に示します。
コンシューマがチャネルに対してpull_waitを発行すると、チャネルはイベントデータを蓄積していないため、pull_waitは待ち状態になります。
サプライヤがグローバルトランザクションに対してCurrent_beginを発行します。
サプライヤが他のリソースに対してアクセスします。通常、他のリソースはデータベースシステムであり、データベースシステムからのデータの入力が想定されます。
サプライヤがチャネルに対してpushを発行します。チャネルでは、イベントデータを保持します。なお、この時点では、イベントデータを保持するだけであり、蓄積処理は行いません。
サプライヤがグローバルトランザクションに対してCurrent_commitを発行します。グローバルトランザクションは、他のリソースおよびチャネルに対してcommit命令を発行します。他のリソースは、トランザクションの完了処理を行います。チャネルは、保持していたイベントデータの蓄積処理を完了します。
コンシューマがグローバルトランザクションに対してCurrent_beginを発行します。
コンシューマがチャネルに対してpullを発行すると、チャネルはイベントデータをpullの復帰値としてコンシューマに通知します。なお、この時点で、チャネルはイベントデータを保持したままの状態です。
コンシューマが他のリソースに対してアクセスします。通常、他のリソースはデータベースシステムであり、データベースシステムへのデータの出力が想定されます。
コンシューマがグローバルトランザクションに対してCurrent_commitを発行します。グローバルトランザクションは、他のリソースおよびチャネルに対してcommit命令を発行します。他のリソースは、トランザクションの完了処理を行います。チャネルではメッセージの受信が完了したことを確認し、イベントデータを削除します。
上記のように、pull_waitを使用することでpullは待ち状態にならず、即時復帰します。したがって、ユーザは適切なトランザクションタイムアウト時間を設定できます。
なお、pull_waitメソッドを発行した場合でも、pull_waitメソッド自身において以下のタイムアウトが発生する可能性があります。本現象が発生した場合は、pull_waitメソッドをリトライするようにしてください。
タイムアウトの種類 | 例外 | マイナーコード |
---|---|---|
pullのイベントデータ待ちタイムアウト | COMM_FAILURE | 0x464a01c1 |
CORBAサービスのタイムアウト | COMM_FAILURE | 0x464a0101 |