2.3.2 同期型メッセージ
TP1/NET/TCP/IPではトランザクションと連動しないで,任意のタイミングで相手システムとメッセージの送受信を行う形態である,同期型メッセージの送受信ができます。同期型メッセージの送受信時に,TP1/NET/TCP/IPでは,次のような機能が使えます。
-
受信メッセージの保留
相手システムから受信したメッセージをいったん保留して,任意のタイミングで受信できます。
-
監視タイマの設定
メッセージの送受信処理を無制限に待つことがないよう,待ち時間を指定できます。監視タイマがタイムアウトした場合,コネクションは切断されますが,コネクション定義(mcftalccn -w)のsrtimoutオペランドにyesを指定することで切断を抑止できます。
ここでは,同期型メッセージの送受信に関する機能について説明します。
なお,メッセージを送受信するときのデータの流れ,およびジャーナルの取得タイミングについては,「付録D メッセージ送受信の処理の流れ」を参照してください。
(1) 同期型メッセージの送信
この形態は,自システムのUAPとメッセージの送信完了を同期する場合に使用します。この場合の「送信完了」とは,TP1/NET/TCP/IPが行うTCP/IPの送信バッファへのメッセージ書き込みが完了したことを表します。したがって,API(dc_mcf_sendsync関数またはCBLDCMCF('SENDSYNC'))がUAPにリターンしたことは,送信メッセージが相手システムに到達したことを示しているわけではありません。
UAPは,API(dc_mcf_sendsync関数またはCBLDCMCF('SENDSYNC'))でTP1/NET/TCP/IPにメッセージの送信を要求します。TP1/NET/TCP/IPは受け取ったメッセージを編集したあと,相手システムに送信処理をします。送信処理が完了した時点で,UAPにリターンします。
dc_mcf_sendsync関数を使用した場合の同期型メッセージの送信を次の図に示します。
-
MHP,またはSPPから同期型メッセージを送信します。
-
TP1/NET/TCP/IPは相手システムにメッセージを送信します。
-
同期型メッセージ送信を要求したUAPに制御が渡されます。
(2) 同期型メッセージの受信
この形態は,自システムのUAPと相手システムからのメッセージ受信を同期する場合に使用します。
UAPは,API(dc_mcf_recvsync関数またはCBLDCMCF('RECVSYNC'))を発行してTP1/NET/TCP/IPにメッセージの受信を要求します。このとき,TP1/NET/TCP/IPが相手システムから受信したメッセージを保留しているかどうかによって,次のように処理が異なります。
- 受信メッセージを保留している場合
-
TP1/NET/TCP/IPはメッセージを編集して,UAPに引き渡します。
- 受信メッセージを保留していない場合
-
相手システムからのメッセージを受信するまで,TP1/NET/TCP/IP内で待ち続けます。相手システムからのメッセージを受信した時点で,メッセージの受信を要求したUAPに渡します。
受信メッセージの保留については,「(4) 受信メッセージの保留」を参照してください。
受信メッセージを保留している場合,および受信メッセージを保留していない場合の同期型メッセージの受信を以降の図に示します。
-
相手システムからメッセージを受信します。
-
MHP,またはSPPから同期型メッセージの受信を要求します。
-
メッセージの同期受信を要求したUAPに制御が渡され,保留した受信メッセージを受信します。
-
MHPまたは,SPPから同期型メッセージの受信を要求します。
-
相手システムからメッセージを受信します。
-
メッセージの同期受信を要求したUAPに制御が渡され,メッセージを受信します。
(3) 同期型メッセージの送受信
自システムからのメッセージ送信と,相手システムからの応答メッセージの受信を連続して行う形態です。この形態は,自システムのUAPと相手システムとの間でメッセージの同期合わせ,順序管理をする場合に使用します。
UAPは,API(dc_mcf_sendrecv関数またはCBLDCMCF('SENDRECV'))を発行してTP1/NET/TCP/IPにメッセージの送受信を要求します。TP1/NET/TCP/IPは受け取ったメッセージを編集したあと,相手システムに送信処理をします。送信処理が完了したあとは,UAPにリターンしないで,引き続き受信待ち状態となります。相手システムからのメッセージを受信すると,TP1/NET/TCP/IPはメッセージを編集して,UAPに引き渡します。
dc_mcf_sendrecv関数を使用した場合の同期型メッセージの送受信を次の図に示します。
-
MHP,またはSPPから同期型メッセージを送受信します。
-
TP1/NET/TCP/IPは相手システムにメッセージを送信します。
-
相手システムからメッセージを受信します。
-
同期型メッセージ送受信を要求したUAPに制御が渡され,メッセージを受信します。
同一コネクションでの自システムからのメッセージ送信と,相手システムからの一方送信メッセージがネットワーク上ですれ違うことがあります。メッセージがネットワーク上ですれ違った場合,TP1/NET/TCP/IPは相手システムからの一方送信メッセージを応答メッセージと見なして受信します。
dc_mcf_sendrecv関数の使用時にメッセージがネットワーク上ですれ違った場合の例を次の図に示します。
-
MHP,またはSPPから同期型メッセージを送受信します。
-
TP1/NET/TCP/IPは相手システムにメッセージを送信します。
-
ネットワーク上ですれ違った相手システムからのメッセージを受信します。
-
同期型メッセージ送受信を要求したUAPに制御が渡され,ネットワーク上ですれ違ったメッセージを受信します。
自システムからメッセージを送信した場合に,すでにTP1/NET/TCP/IPが相手システムからの一方送信メッセージを受信し,論理メッセージを組み立てていたときは,dc_mcf_sendrecv関数またはCBLDCMCF('SENDRECV')が,リターン値DCMCFRTN_73003またはステータスコード73003でエラーリターンします。
(4) 受信メッセージの保留
相手システムから受信したメッセージを,MHPにスケジュールしないで,TP1/NET/TCP/IP内に保留しておくことができます。これによって,ユーザは任意のタイミングでメッセージを受信できます。
相手システムからメッセージを受信した場合,TP1/NET/TCP/IP内に受信メッセージを保留して同期受信要求を待ち合わせるかどうかをコネクション定義(mcftalccn -u)のmsgholdオペランドで指定します。また,受信メッセージが無制限に保留されることを避けるため,コネクション定義(mcftalccn -u)のholdlimitオペランドで,メッセージの最大保留数を指定できます。指定した最大保留数を超過した場合は,コネクションを切断します。
相手システムから受信したメッセージを保留すると,TP1/NET/TCP/IPは受信メッセージ保留通知イベント(RHLDEVT)を通知します。RHLDEVTを通知するには,MCFアプリケーション定義で定義しておく必要があります。
受信メッセージの保留について,dc_mcf_receive関数を使用する場合を例に,次の図に示します。
(a) 受信メッセージの保留判定
相手システムから受信したメッセージを保留するかどうか一意に決定できない場合は,コネクション定義(mcftalccn -u)のmsgholdオペランドにuocを指定し,受信メッセージ保留判定UOCを使用します。これによって,メッセージ単位に保留するかどうかを判定できます。
コネクション定義(mcftalccn -u)のmsgholdオペランドにuocを指定した場合,TP1/NET/TCP/IPは相手システムからメッセージを受信したあと,受信メッセージ保留判定UOCを呼び出します。受信メッセージ保留判定UOCは,TP1/NET/TCP/IPから渡された受信メッセージの内容を基に,受信したメッセージを保留するかどうかを判定します。受信メッセージ保留判定UOCについては,「5.1.13 受信メッセージの保留判定」を参照してください。
受信メッセージの保留判定の流れを,dc_mcf_receive関数およびdc_mcf_recvsync関数を使用する場合を例に,次の図に示します。
(b) 受信メッセージを保留する場合の注意事項
-
TP1/NET/TCP/IPが受信メッセージを保留している間,dc_mcf_sendrecv関数またはCBLDCMCF('SENDRECV')は使用できません(dc_mcf_sendsync関数またはCBLDCMCF('SENDSYNC')は使用できます)。dc_mcf_sendrecv関数またはCBLDCMCF('SENDRECV')を使用した場合は,リターン値DCMCFRTN_73003またはステータスコード73003でエラーリターンします。
-
TP1/NET/TCP/IPがdc_mcf_sendrecv関数またはdc_mcf_recvsync関数(CBLDCMCF('RECVSYNC')またはCBLDCMCF('SENDRECV'))の発行待ちの場合は,TP1/NET/TCP/IPは受信メッセージを保留しないで,仕掛り中のUAPに受信メッセージを引き渡します。このとき,受信メッセージ保留通知イベントの通知,および受信メッセージ保留判定UOCの呼び出しは行いません。
-
ネットワーク上のすれ違いなどにより,dc_mcf_sendrecv関数またはCBLDCMCF('SENDRECV')の送信処理仕掛り中(TCP/IPの送信バッファへのメッセージ書き込み中)に相手システムからメッセージを受信することがあります。この場合,TP1/NET/TCP/IPはコネクション定義の指定内容に従って保留判定(RHLDEVTの通知,受信メッセージ保留判定UOCの呼び出しを含む)を行います。保留した受信メッセージは,dc_mcf_sendrecv関数またはCBLDCMCF('SENDRECV')の送信処理完了後,応答メッセージと見なしてUAPに引き渡されます。dc_mcf_sendrecv関数またはCBLDCMCF('SENDRECV')から渡された応答メッセージが意図しないメッセージであった場合は,受信したメッセージを破棄してdc_mcf_recvsync関数またはCBLDCMCF('RECVSYNC')を再度発行するような処置を行ってください。
(5) コネクションの切断抑止
通常,同期型メッセージの送受信関数の発行時に指定した監視タイマがタイムアウトすると,コネクションは切断されます。しかし,システム定義の指定によっては,コネクションの切断を抑止することができます。
ここでは,コネクションの切断抑止の概要,およびタイムアウト発生時の動作について説明します。
(a) コネクションの切断抑止の概要
コネクションの切断抑止では,送受信関数がタイムアウトした場合のコネクション切断,およびCERREVTの起動を行いません。コネクションの切断を抑止するかどうかは,コネクション定義(mcftalccn -w)のsrtimoutオペランドで指定します。
コネクションの切断を抑止する場合は,入力セグメント判定UOCでの後続メッセージ監視を行わないでください。
dc_mcf_sendrecv関数がタイムアウトした場合の,コネクションの切断抑止の概要を,次の図に示します。
(b) タイムアウト発生時の動作
メッセージの送受信関数のタイムアウト発生時の動作を,次の表に示します。
項番 |
項目 |
コネクション定義(mcftalccn -w)の指定による動作 |
|
---|---|---|---|
srtimoutオペランドにyesを指定 (コネクションの切断を抑止する) |
srtimoutオペランドにnoを指定 (コネクションの切断を抑止しない) |
||
1 |
コネクション |
コネクションを切断しません。 |
コネクションを切断します。 |
2 |
CERREVT |
起動しません。 |
起動します。 次に示す内容を通知します。
|
3 |
リターン値 |
DCMCFRTN_73005(監視タイマタイムアウト)が返されます。 |
|
4 |
ステータスコード |
73005(監視タイマタイムアウト)が返されます。 |