Expiry (MQLONG)

これは、メッセージを書き込むアプリケーションで設定される時間で、10 分の 1 秒単位で表されます。 この時間が経過するまでに宛先キューからメッセージが除去されなかった場合、そのメッセージは廃棄の対象となります。

例えば、有効期限時刻に 1 分を設定するには、 MQMDを設定する必要があります。Expiry を 600 に設定します。

この値は、メッセージが宛先キューに滞在する時間に応じて、またメッセージがリモート・キューに対する書き込みである場合は中間の伝送キューに存在した時間に応じて、減少します。 また、伝送にかなりの時間がかかった場合は、その伝送の時間に応じてメッセージ・チャネル・エージェントによって値を減少させることがあります。 同様に、このメッセージを別のキューに送るアプリケーションも、長時間にわたってメッセージを保持した場合には、必要に応じて値を減分することがあります。 しかし、満了時間は概数として扱われるので、短い時間間隔の調節のためにこの値を減分する必要はありません。

アプリケーションが MQGET 呼び出しを使ってメッセージを取り出したとき、 Expiry フィールドは、有効期限の残り時間を表します。

メッセージの有効期限を過ぎると、メッセージはキュー・マネージャーによって廃棄される対象となります。 まだ満了していないメッセージを戻すブラウズまたは非ブラウズの MQGET 呼び出しが発行されたときに、メッセージが廃棄されます。 例えば、MQGMO の MatchOptions フィールドが MQMO_NONE に設定された非ブラウズ MQGET 呼び出しにおいて FIFO 順のキューから読み取りを実行する場合、満了していないメッセージが出現するまで、満了しているメッセージはすべて廃棄されます。 優先順位方式のキューで同じ呼び出しを発行した場合は、満了していない最初のメッセージより先にキューに到着した満了したメッセージのうち、優先順位が等しいメッセージとそれより優先順位が高いメッセージが廃棄されます。

ブラウズまたは非ブラウズのどちらの MQGET 呼び出しを使用しても満了したメッセージがアプリケーションに戻されることはないので、MQGET 呼び出しが正常に終了した後、メッセージ記述子の Expiry フィールドはゼロより大きい値か、特殊な値である MQEI_UNLIMITED になります。

メッセージをリモート・キューに書き込む場合、メッセージは、宛先キューに到達する前の中間伝送キューにある間に満了してしまう (そして廃棄される) 可能性もあります。

メッセージに MQRO_EXPIRATION_* レポート・オプションの 1 つが指定されている場合は、満了したメッセージが廃棄されるときに、レポートが生成されます。 オプションがまったく指定されていない場合、そうしたレポートは生成されません。指定時間の経過後は、このメッセージは関係がなくなったと見なされます (後のメッセージに置き換わったと考えられるため)。

同期点までに書き込まれたメッセージの有効期限間隔が開始するのは、同期点がコミットされた時点ではなく、メッセージが書き込まれた時点です。 この有効期限間隔は、同期点がコミットされる前に終わる可能性もあります。 その場合、メッセージはコミット操作の少し後に破棄されるため、MQGET 操作への応答としてアプリケーションに返されることはありません。
有効期限に基づいてメッセージを廃棄する他のプログラムはいずれも、要求に応じて、該当のレポート・メッセージを送らなければなりません。
注:
  1. メッセージが Expiry 時間をゼロまたは 999 999 999 より大きい数値で書き込まれた場合、MQPUT または MQPUT1 呼び出しは失敗し、理由コード MQRC_EXPIRY_ERROR が戻ります。この場合、レポート・メッセージは生成されません。

    理由コード 2013、MQRC_EXPIRY_ERROR を有効にするには、環境変数 AMQ_ENFORCE_MAX_EXPIRY_ERROR を有効にする必要があります。

    以下に、 Linux®の例を示します。
    $ export AMQ_ENFORCE_MAX_EXPIRY_ERROR=True
    次の点に注意してください。
    • 重要なのは、変数をエクスポートすることです。
    • 実際の値は無視されますが、セットアップを検討する際には True を使用すると役立つ場合があります。
  2. 有効期限を過ぎたメッセージが、すぐには廃棄されないこともあるので、有効期限を過ぎているため取り出しの対象にならないメッセージがキューに入っている可能性もあります。 それにもかかわらず、これらのメッセージは、キュー・サイズのトリガーなどのあらゆる目的のために、キュー内のメッセージ数のカウントに含められます。

    サブスクライバー/コンシューマー (クライアント) がメッセージを取得しようとして、そのメッセージの有効期限が切れた場合、メッセージが古すぎるために破棄されたため、クライアントは何も受信しません。 また、クライアントはエラー・メッセージを受け取りません。

  3. 満了レポートは、廃棄の対象となったときでなく、メッセージが廃棄されるときに、要求に応じて生成されます。
  4. 満了メッセージの廃棄および満了レポートの生成 (要求がある場合) は、アプリケーションの作業単位の一部ではありません。これは、作業単位の中で動作する MQGET 呼び出しの結果、メッセージが廃棄されるようにスケジュールされていた場合でも同じです。
  5. 満了間近のメッセージが作業単位の中で MQGET 呼び出しによって取り出され、そのあとで、その作業単位がバックアウトされると、メッセージが廃棄の対象になり再び取り出すことができないようになることもあります。
  6. 満了間近のメッセージが MQGMO_LOCK を指定した MQGET 呼び出しによってロックされている場合は、そのメッセージが廃棄の対象になり、MQGMO_MSG_UNDER_CURSOR を指定した MQGET 呼び出しで取り出せなくなることがあります。このような場合は、その後の MQGET 呼び出しが発行されると、理由コード MQRC_NO_MSG_UNDER_CURSOR が戻ります。
  7. 有効期限時刻がゼロよりも大きい要求メッセージを取り出す場合、アプリケーションは応答メッセージを送信するときに以下のいずれかのアクションを実行できます。
    • 有効期限までの残り時間を、要求メッセージから応答メッセージにコピーする。
    • 応答メッセージ中の有効期限を、ゼロより大きい明示的な値に設定する。
    • 応答メッセージ中の有効期限を MQEI_UNLIMITED に設定する。
    実行されるアクションは、アプリケーションの設計によって異なります。 ただし、送達不能 (未配布メッセージ) キューにメッセージを書き込む際のデフォルト・アクションは、メッセージの有効期限の残りをそのまま引き継ぎ、それを減分し続けるという動作でなければなりません。
  8. トリガー・メッセージは、常に、MQEI_UNLIMITED で生成されます。
  9. MQFMT_XMIT_Q_HEADER の Format 名をもつメッセージ (通常は伝送キューに入っている) は、MQXQH 内に 2 番目のメッセージ記述子を持っています。 したがって、それに関連付けられた 2 つの Expiry フィールドを持っています。 この場合、以下の点に注意してください。
    • アプリケーションがリモート・キューにメッセージを書き込む場合、キュー・マネージャーは、メッセージを最初にローカル伝送キューに入れ、MQXQH 構造を用いてアプリケーション・メッセージ・データに接頭部を付加します。 キュー・マネージャーは、2 つの Expiry フィールドを、アプリケーションによって指定された値と同じ値に設定します。

      アプリケーションがローカル伝送キューにメッセージを直接書き込む場合は、メッセージ・データの先頭は既に MQXQH 構造になっており、形式名は MQFMT_XMIT_Q_HEADER でなければなりません。 この場合、アプリケーションは 2 つの Expiry フィールドを同じ値に設定する必要はありません (キュー・マネージャーは、MQXQH 内部の Expiry フィールドに有効な値が含まれているかどうか、またメッセージ・データがその値を保管できるだけの長さであるかを検査します)。 伝送キューに直接書き込むことのできるアプリケーションの場合は、アプリケーションは組み込みメッセージ記述子を持つ伝送キュー・ヘッダーを作成する必要があります。 ただし、伝送キューに書き込まれるメッセージ記述子の満了値が、組み込みメッセージ記述子の値と矛盾する場合、満了エラー拒否が発生します。

    • MQFMT_XMIT_Q_HEADER の Format 名をもつメッセージがキューから (通常のキューであっても、伝送キューであっても) 取り出される場合、キュー・マネージャーは、両方 Expiry フィールドからキューでの待機経過時間を差し引きます。 メッセージ・データに MQXQH の Expiry フィールドを入れる十分な長さがない場合も、エラーは発生しません。
    • キュー・マネージャーは、別個のメッセージ記述子 (つまり、MQXQH 構造体内部に埋め込まれているメッセージ記述子以外のもの) の Expiry フィールドを使用して、メッセージが廃棄の対象になるかどうかをテストします。
    • 2 つの Expiry フィールドの初期値が異なる場合、別個のメッセージが取り出された時点で MQXQH 内の Expiry フィールドに指定した時間は経過していても、そのメッセージ記述子の中の Expiry 時間は、ゼロより大きい (したがってメッセージは廃棄の対象にならない) 可能性があります。 この場合、MQXQH の Expiry フィールドは、ゼロに設定されます。
  10. IMS ブリッジから返される応答メッセージの有効期限は、MQIIH の Flags フィールドで MQIIH_PASS_EXPIRATION が設定されていない限り、無制限になります。 詳しくは、 Flags を参照してください。
以下のような特殊値が認識されます。
MQEI_UNLIMITED
メッセージは、無制限の満了時間を指定されています。

これは、MQGET 呼び出しでは出力フィールド、MQPUT および MQPUT1 呼び出しでは入力フィールドです。 このフィールドの初期値は MQEI_UNLIMITED です。