Interstage Application Server アプリケーション作成ガイド (イベントサービス編)
目次 索引 前ページ次ページ

第4章 アプリケーションの開発(各機能)> 4.5 ローカルトランザクションでのアプリケーション開発

4.5.3 ローカルトランザクションのトランザクションタイムアウトについて

 ローカルトランザクションのトランザクションタイムアウトの監視時間は、不要となったトランザクションを回収することでシステム資源の回収を行う機能です。
 ローカルトランザクションのタイムアウト時間は、essetcnfコマンド、またはessetcnfchnlコマンドを使用して設定します。essetcnfコマンドでの設定については、“構成情報の設定”を、essetcnfchnlコマンドでの設定については、“イベントチャネルの環境設定”を参照してください。
 イベントデータの受信処理もローカルトランザクションのトランザクションタイムアウトの監視対象になります。イベントデータの受信処理は、イベントデータが存在しない場合は待ち状態になりますが、その時間もトランザクションタイムアウトの監視時間に含まれます。
 したがって、トランザクションタイムアウトの監視時間を短い時間にチューニングした場合は、以下のような問題が発生する場合があります。

  1. コンシューマがチャネルに対してlocal_beginを発行します。
  2. コンシューマがチャネルに対してpullを発行すると、チャネルはイベントデータを蓄積していないため、pullは待ち状態になります。
  3. サプライヤがチャネルに対してlocal_beginを発行します。
  4. サプライヤがチャネルに対してpushを発行します。チャネルはイベントデータを保持します。なお、この時点では、イベントデータを保持するだけであり、蓄積処理は行いません。
  5. サプライヤがチャネルに対してlocal_commitを発行します。チャネルは保持していたイベントデータの蓄積処理を完了します。
  6. コンシューマの発行したpullが復帰します。その後、コンシューマは受信したイベントデータの処理を行います。ただし、ここでトランザクションタイムアウトが発生します。
  7. コンシューマがチャネルに対してlocal_commitを発行します。ただし、チャネルはトランザクションタイムアウトが発生したため、エラーを通知します。イベントデータは蓄積されたままの状態です。

 上記のようにpullでのデータ取得後にトランザクションタイムアウトが発生すると、コンシューマがタイムアウトを検出できるのは、local_commitとなります。その際、6.で他の資源に対するトランザクションが完了していたとすると、チャネルと他の資源の一貫性に矛盾が発生する可能性があります。

 この問題を回避するためには、以下の方法があります。

 以下にES_ChannelUtil_pull_waitメソッドを使用した際の動作を示します。

  1. コンシューマがチャネルに対してpull_waitを発行すると、チャネルはイベントデータを蓄積していないため、pull_waitは待ち状態になります。
  2. サプライヤがチャネルに対してlocal_beginを発行します。
  3. サプライヤがチャネルに対してpushを発行します。チャネルはイベントデータを保持します。なお、この時点ではイベントデータを保持するだけであり、蓄積処理は行いません。
  4. サプライヤがチャネルに対してlocal_commitを発行します。チャネルでは保持していたイベントデータの蓄積処理を完了します。
  5. コンシューマがチャネルに対してlocal_beginを発行します。
  6. コンシューマがチャネルに対してpullを発行すると、チャネルはイベントデータをpullの復帰値としてコンシューマに通知します。なお、この時点でチャネルはイベントデータを蓄積したままの状態です。
  7. コンシューマは、受信したイベントデータの処理を行います。
  8. コンシューマがチャネルに対してlocal_commitを発行します。チャネルではメッセージの受信が完了したことを確認して、イベントデータを削除します。

 上記のように、pull_waitを使用することでpullは待ち状態にならず、即時復帰します。したがって、ユーザは適切なトランザクションタイムアウト時間を設定することができます。

 なお、pull_waitメソッドを発行しても、pull_waitメソッド自身が以下のタイムアウトとなる場合があります。その場合は、pull_waitメソッドをリトライするようにしてください。

タイムアウトの種類

例外

マイナーコード

pullのイベントデータ待ちタイムアウト

COMM_FAILURE

0x464a01c1
0x464a09c1

ローカルトランザクションタイムアウト

COMM_FAILURE

0x464a01c5
0x464a09c5

CORBAサービスのタイムアウト

COMM_FAILURE

0x464a0101
0x464a0901


目次 索引 前ページ次ページ

All Rights Reserved, Copyright(C) 富士通株式会社 2005