期限切れのメッセージは、MsgId または CorrelId で直接取得した場合でも、次に取得した場合でも、アプリケーションに返されることはありません。
有効期限が切れたメッセージは、内部タスクによって、およびメッセージに通知する MQGET を渡すことによって、キューから消去されます。
これについては、developerWorksで詳しく説明されており、次のように記載されています。
z/OS プラットフォームでこの状況 (MQGET が読み取ろうとしていないために期限切れのメッセージがキューに残されている) を解決するには、EXPRYINT (有効期限間隔) キュー・マネージャー属性を使用して、メッセージを削除する期間を指定できます。有効期限に達するたびに、キュー マネージャーはキューをスキャンして期限切れのメッセージを破棄します。
キュー・マネージャーが UNIX 分散プラットフォーム上にある場合、MQ V6 には、分散プラットフォームに対して同様の方法で機能する期限切れタスクが組み込まれています。
IBM には、動作の詳細を説明したより公式な技術情報もあり、こちらに次のように記載されています。
WMQ V6.0 から、期限切れのメッセージをサイレントに内部的に破棄する機能が追加されました。
メッセージが期限切れになると、次の場合に破棄されます: メッセージに一致する MQGET が発行された場合、または キュー マネージャーの有効期限タスクによって内部的に削除された場合。
デフォルトでは、内部失効タスクは 300 秒 (5 分) ごとに実行されます。このタスクの頻度を変更したい場合は、「ExpiryInterval」設定を使用できます。この値は秒単位で構成され、範囲は 1 ~ 1,000,000 秒です。値を「0」に設定すると、タスクが無効になります。
z/OS では、「ExpiryInterval」はキュー マネージャーの属性です。分散プラットフォームでは、キュー マネージャーの qm.ini ファイルの「TuningParameters」スタンザに「ExpiryInterval」を追加できます。