呼び出しメッセージ待ち行列

呼び出しメッセージ待ち行列を使用すると、 あるプログラムまたはプロシージャーと別のプログラムまたはプロシージャーの間で、 メッセージを送信することができます。

プログラムまたはプロシージャーが呼び出しスタック上にある (まだ戻されていない) 限り、 その呼び出しメッセージ待ち行列は活動状態であり、 そのプログラムまたはプロシージャーにメッセージを送信できます。 プログラムまたはプロシージャーが戻されると、メッセージを送信できなくなります。 呼び出しメッセージ待ち行列に送信できるメッセージ・タイプには、 情報、要求、完了、診断、状況、エスケープ、および通知があります。

OPM プログラムまたは ILE プロシージャーの呼び出しメッセージ待ち行列が作成されるのは、 そのプログラムまたはプロシージャーが呼び出されるときです。 呼び出しメッセージ待ち行列は、 そのプログラムまたはプロシージャーが実行される呼び出しスタック項目のみに排他的に関連付けられます。 呼び出しメッセージ待ち行列は、呼び出しスタック項目を識別することによって間接的に識別されます。 呼び出しスタック項目は、 その呼び出しスタック項目内で実行されるプログラムまたはプロシージャーの名前によって識別されます。

OPM プログラムの場合、関連する呼び出しスタック項目は、 (最高) 10 文字のプログラム名で識別されます。 ILE プロシージャーの場合、関連する呼び出しスタック項目は、 (最高) 4096 文字のプロシージャー名、(最高) 10 文字のモジュール名、 および (最高) 10 文字のプログラム名から構成される、3 部分の名前によって識別されます。 モジュール名は、プロシージャーがコンパイルされたモジュールの名前です。 ILE プログラム名は、モジュールがバインドされた ILE プログラムの名前です。

ILE プロシージャーの呼び出しスタック項目を識別するときには、 プロシージャー名を指定するだけで十分です。 プロシージャー名だけで呼び出しスタック項目が固有に識別されない場合は、 モジュール名または ILE プログラム名も指定できます。 メッセージの送信時に、 プログラムまたはプロシージャーが複数の呼び出しスタック上にある場合、指定された名前は、 そのプログラムまたはプロシージャーの最後に呼び出されたオカレンスを識別します。

OPM または ILE プログラムが呼び出しスタック上にあるときにコンパイルされ、 置換された場合は、プログラム名を使用して呼び出しスタック項目を参照するときに注意が必要です。 置換操作が実行された時点より前からスタック上にある呼び出しスタック項目については、 名前参照は置換されたオブジェクト (現在 QRPLOBJ 内に存在している) に解決されます。 これらの名前参照は、 置換されたオブジェクトが引き続き QRPLOBJ ライブラリー内に存在している限りは有効です。 置換操作が実行された時点よりも新しいスタック項目については、 名前参照はプログラムの新しいバージョンに関するものになります。 使用するバージョンが判別される方法のため、 プログラムをライブラリー QRPLOBJ に直接入れてはなりません。 このライブラリーは、 プログラムの置換されたバージョンのために排他的に使用しなければなりません。 直接 QRPLOBJ に入れたプログラムへの名前参照は、失敗します。

プログラム・オブジェクトが除去または名前変更されたが、 そのオカレンスが呼び出しスタック上にある場合は、 除去されたプログラムへの名前参照、または古い名前を用いた名前参照は失敗します。 ILE プロシージャーの場合、参照にプロシージャーおよびモジュール名のみを使用していれば、 プログラムの名前変更は名前参照に影響しません。 ILE プログラム名も使用している場合は、名前参照が失敗します。

プログラムまたはプロシージャーが終了すると、 プログラムまたはプロシージャーの呼び出しスタック項目用のメッセージ待ち行列は、 使用できなくなります。 関連する呼び出しメッセージ待ち行列上にあったメッセージは、その時点で、 そのメッセージのメッセージ参照キーを用いて参照することしかできなくなります。

例えば、プロシージャー A がプロシージャー B を呼び出し、 プロシージャー B がプロシージャー C を呼び出し、 プロシージャー C はプロシージャー B にメッセージを送信して終了するとします。 メッセージはプロシージャー B で使用可能です。 しかし、プロシージャー B が終了すると、 その呼び出しメッセージ待ち行列は使用できなくなるため、 メッセージがジョブ・ログ内に示されている場合でも、 プロシージャー A からプロシージャー B へはアクセスできません。 プロシージャー A は、 プロシージャー B に送信されるメッセージに対してメッセージ参照キーを持っていなければ、 そのメッセージにアクセスできません。

呼び出しメッセージ待ち行列
プロシージャー A が特定のメッセージを削除する必要がある場合は、次のことを行えます。
  • プロシージャー C に、特定のメッセージをプロシージャー A へ送信させる。
  • プロシージャー B にメッセージをプロシージャー A へ移動させる、または再送信させる。

以下の図は、プロシージャー呼び出し、ジョブ・メッセージ待ち行列、 および呼び出しスタック項目待ち行列の関係を示すものです。 プロシージャー A はメッセージをそれ自体および *EXT に送信してからプロシージャー B を呼び出します。プロシージャー B はプロシージャー C を呼び出します。プロシージャー C は、メッセージをその呼び出し元 (プロシージャー B) に送信してからプロシージャー D を呼び出します。プロシージャー D は、メッセージをそれ自体に送信してから、プロシージャー B を呼び出します。 結合線 (-----) は、どのプロシージャー呼び出しがどのメッセージ待ち行列と関連するかを示します。

プロシージャー呼び出し、ジョブ・メッセージ待ち行列、 および呼び出しスタック項目待ち行列の関係。
前の図では、プロシージャー B には 2 つの呼び出しスタック項目待ち行列があります (プロシージャーの呼び出しごとに 1 つずつ)。 プロシージャー C にはメッセージが送られていないため、 プロシージャー C のメッセージ待ち行列はありません。 プロシージャー C がプロシージャー B にメッセージを送信すると、 メッセージは、プロシージャー B の最後の呼び出しの呼び出しスタック項目待ち行列に入れられます。
注: コマンド入力画面を使用している場合は、F10 (詳細なメッセージの組み込み) を押すことによって、 ジョブ・メッセージ待ち行列に送信されたすべてのメッセージを表示できます。 メッセージが表示された後、いずれかのロール・キーを用いて、 画面表示を上下に移動することができます。

さらに、ジョブ・ログ表示 (DSPJOBLOG) コマンドを使用すると、 ジョブのメッセージを表示することができます。