13.3 トリガイベントの条件
次に示す条件が満たされるとき,キューマネジャはトリガメッセージを生成します。
-
メッセージがキューに登録されること。
-
メッセージの優先度が,トリガのためのメッセージ優先度の下限値以上であること。この下限値はローカルキューのTriggerMsgPriority属性に指定します。0を指定すると,すべてのメッセージでトリガメッセージが発生します。
-
TriggerMsgPriority属性値以上の優先度のメッセージが,キューにすでにあること。メッセージ数はTriggerType属性によって異なります。
-
0(TriggerType属性がMQTT_FIRSTのとき)
-
任意の数(TriggerType属性がMQTT_EVERYのとき)
-
TriggerDepth属性値−1(TriggerType属性がMQTT_DEPTHのとき)
- 注意
-
キューマネジャは,トリガイベントの条件を満たすメッセージを数えるときに,コミット済みであるかコミット待ちであるかに関係なく数えます。そのため,キューのメッセージがコミット待ちであるために,キューにメッセージがない状態でアプリケーションが開始されることもあります。この場合は,アプリケーションがメッセージの到着を待ち合わせるように,WaitIntervalフィールドを適切に指定して待ち合わせオプションを使用することをお勧めします。
-
-
トリガタイプがfirstまたはdepthの場合は,メッセージの取り出し用にアプリケーションキューをオープンしているアプリケーションがないこと。つまり,ローカルキューのOpenInputCount属性が0であること。
-
次に示すどちらかの条件を満たすこと。
-
ローカルキューのProcessName属性が空白でなく,該当するプロセス定義オブジェクトが作成されていること。
-
ProcessName属性が空白の転送キューであること。プロセス定義がオプションなので,開始するチャネル名がTriggerData属性に含まれることがあります。この場合,トリガメッセージには次に示す値が設定されます。
QName属性:キュー名
ProcessName属性:空白
TriggerData属性:トリガデータ
ApplType属性:MQAT_UNKNOWN
ApplId属性:空白
EnvData属性:空白
UserData属性:空白
-
-
イニシエーションキューが作成され,InitiationQName属性に指定されていること。イニシエーションキューは,次に示す設定にしてください。
-
取り出し操作を許可すること(InhibitGet属性がMQQA_GET_ALLOWED)
-
登録操作を許可すること(InhibitPut属性がMQQA_PUT_ALLOWED)
-
Usage属性をMQUS_NORMALにすること
-
論理的に削除されている動的キューにしないこと
-
-
トリガモニタアプリケーションでイニシエーションキューをメッセージの取り出し用にオープンしていること。つまり,ローカルキューのOpenInputCount属性が0より大きいこと。
-
アプリケーションキューのトリガ制御(TriggerControl属性)がMQTC_ONであること。
-
トリガタイプ(TriggerType属性)がMQTT_NONEでないこと。
上記の条件1から9が満たされ,トリガ条件を発生させたメッセージがトランザクション内で登録される場合では,コミットとロールバックに関係なく,トランザクションが完了するまでトリガモニタアプリケーションからトリガメッセージは利用できません。トランザクションがコミットされるか,ロールバックされるか(トリガタイプがMQTT_FIRSTまたはMQTT_DEPTHの場合)に関係なく利用できません。
-
適切なメッセージがキューに登録される場合にTriggerType属性がMQTT_FIRSTまたはMQTT_DEPTHのキューが,それぞれ次に示す条件を満たすこと。
-
事前に空でないこと(MQTT_FIRSTのとき)
-
TriggerDepth属性値以上のメッセージがあること(MQTT_DEPTHのとき)
上記の条件2から9(3を除く)が満たされ,MQTT_FIRSTのときは,最後のトリガメッセージがキューに登録されてから必要なトリガ間隔(キューマネジャ定義のTriggerInterval属性)が経過していなければなりません。
これによって,キューのすべてのメッセージを処理する前にキューサーバを終了できるようになります。トリガ間隔の目的は重複するトリガメッセージの数を減らすことです。
- 注意
-
キューマネジャを終了したあとで再度開始する場合は,トリガ間隔のタイマはリセットされます。
-
-
TriggerType属性がMQTT_FIRSTまたはMQTT_DEPTHのキューを処理する,単一のアプリケーションがMQCLOSE命令を発行すること。そのとき少なくとも次に示す数のメッセージがキューにあること。
-
1(MQTT_FIRSTのとき)
-
TriggerDepth属性値(MQTT_DEPTHのとき)
キューのメッセージには必要な優先度(条件2)があり,条件5から9も満たすようにしてください。
これによってMQGET命令を発行するキューサーバは,キューが空であることを検出して終了できるようになります。ただし,MQGET命令とMQCLOSE命令の間に一つ以上のメッセージが到着することがあります。
- 注意
-
a.アプリケーションキューを処理するアプリケーションですべてのメッセージを取り出さない場合,処理はループします。これは,アプリケーションがキューをクローズするたびに,キューマネジャが追加のトリガメッセージを生成し,トリガモニタアプリケーションにサーバプログラムを再度開始させるためです。
b.キューをクローズする前に,アプリケーションキューを処理するアプリケーションが取り出し要求をロールバックする場合,またはアプリケーションが中断する場合も同じループが発生します。
c.上記のループを防止するには,MQMD構造体のBackoutCountフィールドを使用し,繰り返しロールバックされたメッセージを検出してください。詳細については,「3.10 ロールバックされたメッセージ」を参照してください。
-
-
MQSET命令を使用して次に示す条件を満たすこと。
a.
-
TriggerControl属性をMQTC_ONに変更すること
-
TriggerControl属性がすでにMQTC_ONの場合にTriggerType,TriggerMsgPriority,または必要に応じてTriggerDepth属性を変更すること
また,このとき少なくとも次に示す数のメッセージがキューにあること
-
1(MQTT_FIRSTまたはMQTT_EVERYのとき)
-
TriggerDepth属性値(MQTT_DEPTHのとき)
キューのメッセージには必要な優先度(条件2)があり,条件4から9も満たすようにしてください。
これによって,トリガ条件がすでに満たされているときにアプリケーションからトリガ基準を変更できます。
b.
イニシエーションキューのInhibitPut属性をMQQA_PUT_INHIBITEDからMQQA_PUT_ALLOWEDに変更するときに,少なくとも次に示す数のメッセージがキューにあること
-
1(MQTT_FIRSTまたはMQTT_EVERYのとき)
-
TriggerDepth属性値(MQTT_DEPTHのとき)
イニシエーションキューのメッセージには必要な優先度(条件2)があり,条件4から9も満たすようにしてください。一つのトリガメッセージが条件を満たす各キューについて生成されます。
これによって,イニシエーションキューにMQQA_PUT_INHIBITEDを設定してあとから変更するときにトリガメッセージを発生させることができます。
c.
イニシエーションキューのInhibitGet属性がMQQA_GET_INHIBITEDからMQQA_GET_ALLOWEDに変更されるときに,少なくとも次に示す数のメッセージがキューにあること
-
1(MQTT_FIRSTまたはMQTT_EVERYのとき)
-
TriggerDepth属性値(MQTT_DEPTHのとき)
イニシエーションキューのメッセージには必要な優先度(条件2)があり,条件4から9も満たすようにしてください。
これによって,アプリケーションキューからメッセージを取り出せるときにだけアプリケーションをトリガするようにできます。
d.
トリガモニタアプリケーションがイニシエーションキューからの取り出し用にMQOPEN命令を発行するときに,少なくとも次に示す数のメッセージがキューにあること
-
1(MQTT_FIRSTまたはMQTT_EVERYのとき)
-
TriggerDepth属性値(MQTT_DEPTHのとき)
イニシエーションキューのメッセージには必要な優先度(条件2)があり,条件4から9も満たすようにしてください。また,他アプリケーションが取り出し用にイニシエーションキューをオープンしていない状態にしてください。条件を満たす各キューについて一つのトリガメッセージが生成されます。
これによって,トリガモニタアプリケーションが動作していない間にキューに到着したメッセージ,およびキューマネジャの再度の開始で失ったトリガメッセージ(永続メッセージでない)についてトリガを発生させることができます。
-
- 注意
-
-
条件11以降(アプリケーションキューへのメッセージ到着以外のイベントでのトリガメッセージ生成)では,トリガメッセージはトランザクションとして登録されません。また,TriggerType属性がMQTT_EVERYの場合にアプリケーションキューに一つ以上のメッセージがあるときは,トリガメッセージが一つだけ生成されます。
-
MQPUT命令の発行時にメッセージをセグメント分割する場合は,キューにすべてのセグメントが登録されるまでトリガイベントは処理されません。しかし,メッセージセグメントがいったんキューに登録されると,TP1/Message Queueは各セグメントを独立したトリガのためのメッセージとして処理します。例えば,3分割された一つの論理メッセージでは,最初のMQPUT命令でセグメント分割されたときに一つのトリガイベントが発生します。
-