2.6.3 後続メッセージの読み出し

TP1キャッシュ機能使用時は,トランザクション実行中(UAP処理中)に,該当するサービスに滞留している後続メッセージを読み出せます。後続メッセージを読み出すには,ee_scd_msg_receive関数を発行します。なお,この関数を発行できるのは,ユーザサービス関連定義のserviceオペランドの同時処理限界数に1が指定されたサービスだけです。

同時処理限界数に1を指定した場合は,一つのトランザクションで複数のメッセージを読み出せます。読み出せるメッセージは,トランザクション起動時に入力キューに滞留しているメッセージです。トランザクション実行中に新たに書き込まれたメッセージは,次のトランザクションから読み出せます。

一つのトランザクションで読み出せるのは,優先キューと通常キューのどちらか一方に滞留しているメッセージです。サービストランザクション起動時に読み出したキューと,同じ(優先または通常)キューに滞留しているメッセージを読み出せます。

後続メッセージの読み出し例を次の図に示します。

図2-36 後続メッセージの読み出し例

[図データ]

説明
  1. 処理キュー引き出し後のメッセージ読み出しで,入力メッセージ1を読み出し,UAPを起動します。
  2. ee_scd_msg_receive関数によって,入力メッセージ2を読み出します。
  3. ee_scd_msg_receive関数によって,入力メッセージ3を読み出します。
<この項の構成>
(1) 読み出しできる後続メッセージの条件
(2) 読み出しできる後続メッセージの上限
(3) 後続メッセージ読み出し時の格納領域の上書き
(4) コミット決着失敗通知(ERRTRNR)時およびUAP異常終了通知(ERRTRN3)時の動作

(1) 読み出しできる後続メッセージの条件

ee_scd_msg_receive関数で,読み出すメッセージの種別をAPI引数で指定できます。ee_scd_msg_receive発行時に,後続メッセージの読み出し方法を「メッセージ種別を指定しない方式」および「メッセージ種別を指定する方式」から選択できます。

(a) メッセージ種別を指定しない方式

ee_scd_msg_receive関数で読み出せる後続メッセージ種別は,トランザクション起動時と同じメッセージ種別で,RPCメッセージ,MCPメッセージ,タイマメッセージ,およびMCHメッセージです。

ただし,RPCメッセージの場合,応答型RPC,トランザクショナルRPC,およびRAPは読み出せません。また,タイマメッセージの場合,永続か非永続かによって異なるメッセージ種別として扱います。

(b) メッセージ種別を指定する方式

メッセージ種別を指定する方式は,トランザクション起動時と異なるメッセージ種別の読み出しができます。次のメッセージ種別を指定できます。

指定したメッセージ種別だけの読み出しができ,起動時のメッセージ種別も指定しない場合は,読み出しはできません。例えば,MCPメッセージでトラザクション起動した場合,MCPのメッセージ種別を指定しなければMCPメッセージの読出しはできません。

起動時に読み出したメッセージ種別と後続メッセージで読み出しできるメッセージ種別の組み合わせを示します。

表2-20 起動時のメッセージ種別と後続メッセージの組み合わせ

後続メッセージ起動時のメッセージ
MCPmachRPCタイマ
(永続)
タイマ
(非永続)
左記以外
MCP××
mach××××××
RPC××
タイマ(永続)××
タイマ(非永続)××
上記以外××××××
(凡例)
○:メッセージ種別指定時,読み出しができます。
×:読み出しができません。

(2) 読み出しできる後続メッセージの上限

ee_scd_msg_receive関数は,トランザクション起動時に登録済みのメッセージ数以上の回数を発行できません。上限を超えてee_scd_msg_receive関数を発行した場合は,「読み出し上限を超えた」としてエラーになります。

(3) 後続メッセージ読み出し時の格納領域の上書き

後続メッセージは,トランザクション起動時と同様,入力メッセージ引き渡しエリア(IMA)にコピーされます。このため,ee_scd_msg_receive関数を発行すると,前に読み込んだメッセージやトランザクション起動時のインタフェース情報は上書きされます。受信側のUAPから見ると,ee_scd_msg_receive関数を発行することで新しいトランザクションを起動することになります。

後続メッセージを読み出すときの格納領域の上書きを次の図に示します。

図2-37 後続メッセージを読み出すときの格納領域の上書き

[図データ]

ee_scd_msg_receive関数を発行すると直前のメッセージを参照できなくなるため,必要に応じて事前に退避してください。

(4) コミット決着失敗通知(ERRTRNR)時およびUAP異常終了通知(ERRTRN3)時の動作

コミット決着に失敗するとエラートランザクションのERRTRNRが起動します。また,UAPが異常終了すると,エラートランザクションのERRTRN3が起動します。

通常は,トランザクション起動時にUAPに引き渡した入力メッセージを,ERRTRNRまたはERRTRN3の入力メッセージとして引き渡します。しかし,ee_scd_msg_receive関数を使用して後続メッセージを読み出している場合は,最後に発行したee_scd_msg_receive関数で読み出した入力メッセージをERRTRNRまたはERRTRN3の入力メッセージとして引き渡します。

UAP異常終了通知(ERRTRN3)時の動作を次の図に示します。

図2-38 UAP異常終了通知(ERRTRN3)時の動作

[図データ]

UAPが異常終了すると,メッセージをロールバックして,入力キューを未読み出しの状態にします。そのため,ERRTRN3で引き渡された入力メッセージは,ERRTRN3終了後に,通常のトランザクションまたはERRTRN2で再度UAPに引き渡されます。