分散トランザクション処理機能 OpenTP1 解説

[目次][用語][索引][前へ][次へ]

3.3.9 アプリケーションプログラムのメッセージ送受信

<この項の構成>
(1) UAPのメッセージ受信
(2) UAPのメッセージ送信
(3) UAPからのアプリケーションの起動
(4) OpenTP1終了時のメッセージの扱い
(5) メッセージ出力通番

(1) UAPのメッセージ受信

OpenTP1は,相手システムからコネクションを通してメッセージを受信します。コネクションとは,相手システムとMCFの論理的な通信路のことです。OpenTP1が受信したメッセージは,MCF通信プロセスが管理します。MCFは,メッセージに組み込まれたアプリケーション名をサービスグループ名とサービス名に変換し,受信メッセージを入力キューに書き込みます。

入力キューは,サービス要求としての入力を管理する待ち行列です。ディスクキューに書き込むメッセージの場合,サービスグループ単位にキューを割り当てます。ディスクキューのうち,個々のサービスグループに割り当てた部分をキューファイルといいます。対応するサービスグループの名称がキューファイル名になります。メモリキューに書き込むメッセージの場合も同様に,サービスグループ単位でキューを管理します。

MCFは,入力キューに受信メッセージの最終セグメントを書き込んだ時点で,サービス要求を該当するMHPのスケジュールキューに登録します。スケジュールされたMHPは,受信メッセージをセグメント単位にdc_mcf_receive関数で受信します。

UAPのメッセージ受信の概要を次の図に示します。

図3-36 UAPのメッセージ受信の概要

[図データ]

(2) UAPのメッセージ送信

MCFは,メッセージに組み込まれた論理端末名称を基に,送信メッセージを出力キューに書き込みます。論理端末名称とは,マルチウィンドウを持つワークステーションの一つのウィンドウや,プリンタなどの端末の実体ごとに,ユーザが任意に付ける名称です。OpenTP1は,端末の実体を論理端末名称を持つ論理端末として識別します。論理端末名称は,論理端末定義で指定します。

ディスクキューを使用する送信メッセージの場合,論理端末ごとにキューを割り当てます。ディスクキューのうち,個々の論理端末に割り当てた部分をキューファイルといいます。対応する論理端末の名称がキューファイル名になります。メモリキューを使用する送信メッセージの場合も同様に,論理端末ごとにキューを管理します。

プロトコル対応に作成したMCF通信プロセスが,セグメント単位で他システムにメッセージを送信します。

UAPのメッセージ送信の概要を次の図に示します。

図3-37 UAPのメッセージ送信の概要

[図データ]

(a) 一方送信メッセージの送信

MHPとSPPは,dc_mcf_send関数で相手システムへ一方送信メッセージを送信できます。送信先として論理端末名称を指定します。

(b) 問い合わせに対する応答メッセージの送信

MHPは,相手システムからの問い合わせメッセージをdc_mcf_receive関数で受信したあと,応答メッセージをdc_mcf_reply関数問い合わせ発生元論理端末へ送信できます。

(c) 問い合わせメッセージの送信

MHPとSPPは,相手システムへ問い合わせメッセージをdc_mcf_send関数で送信できます。

(d) 同期型のメッセージの送信

MHPとSPPは,相手システムへ同期型のメッセージをdc_mcf_sendsync関数,またはdc_mcf_sendrecv関数で送信できます。

dc_mcf_sendsync関数は,相手システムにメッセージを送信し終わるまでUAPの処理を止めるため,相手システムのUAP処理と同期がとれます。

dc_mcf_sendrecv関数は,相手システムにメッセージを送信し終わってから,応答を自システムで受信するまでUAPの処理を止めるため,相手システムのUAP処理と同期がとれます。

(3) UAPからのアプリケーションの起動

アプリケーション起動機能を使えば,メッセージの編集・送信用のMHPを作成することで,メッセージ送信を一元化できます。

応答メッセージを編集して送信するMHPを作成すれば,問い合わせメッセージを受信したMHPに代わって,問い合わせ発生元論理端末への応答を任せることができます。また,一方送信メッセージを編集して送信するMHPを作成すれば,MHPまたはSPPからこのMHPを起動することで,メッセージ送信を任せることもできます。どちらの場合も,送信要求元のUAPからdc_mcf_execap関数を呼び出すことでメッセージの送信を一元化します。

dc_mcf_execap関数は非同期型の通信関数です。MCFは,メッセージを編集して送信するMHPを,関数を呼び出したMHPやSPPのサービス正常終了直後,または指定された時間が経過したあとに起動(タイマ起動)します。このため,送信要求元のMHPやSPPと,メッセージを編集して送信するMHPとは,別のグローバルトランザクションになります。送信要求元のMHPやSPPは,送信先の論理端末名称などの必要なデータをMCF経由で,メッセージを編集して送信するMHPに渡します。なお,タイマ起動の場合には,mcfadltapコマンドまたはdc_mcf_adltap関数で起動要求をキャンセルできます。

メッセージ送信の一元化を次の図に示します。

図3-38 メッセージ送信の一元化

[図データ]

(4) OpenTP1終了時のメッセージの扱い

(a) 未処理メッセージの監視

MCFは,終了処理の開始から出力キューのメッセージがなくなるまでの時間を監視します。出力キューのメッセージが処理されないで,終了処理に時間が掛かることを防止するためです。出力キューのメッセージがなくなるまでの監視時間を,未処理送信メッセージ滞留時間といいます。監視時間を超えても出力キューに残っているメッセージは廃棄し,未処理送信メッセージ廃棄イベント(ERREVTA)に対応するMCFイベント処理用MHPが作成してあれば,これを起動します。ただし,応答メッセージに限り,未処理送信メッセージ滞留時間の対象にはなりません。システム終了時に滞留している応答メッセージは無条件に削除されます。このとき,ERREVTAは通知されません。

また,MCFは終了処理の開始から入力キューのメッセージがなくなるまでの時間を監視します。MHPで異常な処理をしたために入力キューのメッセージが処理されないで,終了処理が終わらないことを防止するためです。また,正常終了時にサービスグループの閉塞によって滞留しているメッセージは破棄されERREVT2で通知されます。入力キューのメッセージがなくなるまでの監視時間を,未処理受信メッセージ滞留時間といいます。未処理受信メッセージ滞留時間を過ぎても,入力キューにメッセージが残っている場合には,MHPに何らかの異常があるものと見なして,MCFを異常終了させます。

未処理送信メッセージ滞留時間と未処理受信メッセージ滞留時間は,MCF通信構成定義で指定します。

(b) OpenTP1の終了モードと未処理メッセージの監視との関係

OpenTP1の終了モードには,正常終了強制正常終了計画停止A計画停止B,および強制停止があります。

正常終了および強制正常終了のときには,新たなメッセージの受け付けを禁止したあと,未処理受信メッセージ滞留時間未処理送信メッセージ滞留時間を監視して,入力キューと出力キューのメッセージがなくなるまで処理を続けます。

計画停止Aのときには,新たなメッセージの受け付けを禁止したあと,入力キューのメッセージがなくなるまで処理を続けます。出力キューにメッセージが残っていても終了します。出力キューに残ったメッセージは,次回の再開始時に処理します。ただし,メモリ出力キューのメッセージ,およびMCF通信構成定義のmcftpsvrコマンドの-oオプションにreruntm=noを指定している場合のタイマ起動要求のメッセージは回復できません。計画停止Aのときには,未処理受信メッセージ滞留時間だけを監視します。

計画停止Bのときには,OpenTP1が現在実行しているサービスだけを完了させて終了します。入力キューや出力キューのメッセージは処理されないままになるため,未処理メッセージの滞留時間を監視しません。入出力キューに残ったメッセージは,次回の再開始時に処理します。ただし,メモリキューのメッセージ,およびMCF通信構成定義のmcftpsvrコマンドの-oオプションにreruntm=noを指定している場合のタイマ起動要求のメッセージは回復できません。

強制停止のときには,OpenTP1が現在実行しているサービスの完了を待たないで終了します。未処理メッセージの滞留時間も監視しません。入出力キューに残ったメッセージは,次回の再開始時に処理します。ただし,メモリキューのメッセージ,およびMCF通信構成定義のmcftpsvrコマンドの-oオプションにreruntm=noを指定している場合のタイマ起動要求のメッセージは回復できません。

相手システムにメッセージを送信したあとに,自システムがオンラインダウン,または強制停止し,送信済みのメッセージが送信完了扱いとならない場合,再開始後に再度,メッセージが送信されることがあります。そのため,相手システムとの間で,二重送信の扱いについて考慮する必要があります。

OpenTP1の終了と入出力キューのメッセージに対する処理を次の表に示します。

表3-6 OpenTP1の終了と入出力キューのメッセージに対する処理

終了モード 入力キュー中のメッセージ 出力キュー中のメッセージ
正常終了,強制正常終了 すべて処理する すべて処理する
計画停止A すべて処理する 残す
計画停止B 残す 残す
強制停止 残す 残す

(5) メッセージ出力通番

OpenTP1は,UAPからの送信メッセージに対して,メッセージ種別(問合せ応答メッセージ,一般分岐メッセージ,および優先分岐メッセージ)ごとに一連の番号を付けられます。この一連の番号をメッセージ出力通番(出力通番)と呼びます。

出力通番の目的は次のとおりです。

dc_mcf_send関数またはdc_mcf_reply関数を呼び出すときに,出力通番を付けるかどうかを指定できます。出力通番を付ける指定をしたdc_mcf_send関数またはdc_mcf_reply関数を呼び出した場合,OpenTP1はメッセージに出力通番を付けたあと,メッセージを出力キューに書き込みます。

また,UAPに送信メッセージの通番編集UOCを組み込んだ場合,出力通番を付ける指定をしたdc_mcf_send関数またはdc_mcf_reply関数の先頭セグメントの送信時に,OpenTP1は送信メッセージの通番編集UOCを呼び出します。このUOCでは,先頭セグメントの任意の位置に出力通番を設定するなどの処理ができます。

出力通番は,OpenTP1の再開始時に引き継がれます。

出力キュー内の先頭と最後の未送信メッセージに付けられている出力通番は,mcftlsleコマンドで表示できます。