TP1/NET/TCP/IPではトランザクションと連動しないで,任意のタイミングで相手システムとメッセージの送受信を行う形態である,同期型メッセージの送受信ができます。同期型メッセージの送受信時に,TP1/NET/TCP/IPでは,次のような機能が使えます。
ここでは,同期型メッセージの送受信に関する機能について説明します。
なお,メッセージを送受信するときのデータの流れ,およびジャーナルの取得タイミングについては,「付録D メッセージ送受信の処理の流れ」を参照してください。
この形態は,自システムの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関数を使用した場合の同期型メッセージの送信を次の図に示します。
図2-31 同期型メッセージの送信
この形態は,自システムのUAPと相手システムからのメッセージ受信を同期する場合に使用します。
UAPは,API(dc_mcf_recvsync関数またはCBLDCMCF('RECVSYNC'))を発行してTP1/NET/TCP/IPにメッセージの受信を要求します。このとき,TP1/NET/TCP/IPが相手システムから受信したメッセージを保留しているかどうかによって,次のように処理が異なります。
受信メッセージの保留については,「(4) 受信メッセージの保留」を参照してください。
受信メッセージを保留している場合,および受信メッセージを保留していない場合の同期型メッセージの受信を以降の図に示します。
図2-32 同期型メッセージの受信(受信メッセージを保留している場合)
図2-33 同期型メッセージの受信(受信メッセージを保留していない場合)
自システムからのメッセージ送信と,相手システムからの応答メッセージの受信を連続して行う形態です。この形態は,自システムの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関数を使用した場合の同期型メッセージの送受信を次の図に示します。
図2-34 同期型メッセージの送受信
同一コネクションでの自システムからのメッセージ送信と,相手システムからの一方送信メッセージがネットワーク上ですれ違うことがあります。メッセージがネットワーク上ですれ違った場合,TP1/NET/TCP/IPは相手システムからの一方送信メッセージを応答メッセージと見なして受信します。
dc_mcf_sendrecv関数の使用時にメッセージがネットワーク上ですれ違った場合の例を次の図に示します。
図2-35 ネットワーク上でメッセージがすれ違った場合の同期型メッセージの送受信
自システムからメッセージを送信した場合に,すでにTP1/NET/TCP/IPが相手システムからの一方送信メッセージを受信し,論理メッセージを組み立てていたときは,dc_mcf_sendrecv関数またはCBLDCMCF('SENDRECV')が,リターン値DCMCFRTN_73003またはステータスコード73003でエラーリターンします。
相手システムから受信したメッセージを,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関数を使用する場合を例に,次の図に示します。
図2-36 受信メッセージの保留
相手システムから受信したメッセージを保留するかどうか一意に決定できない場合は,コネクション定義(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関数を使用する場合を例に,次の図に示します。
図2-37 受信メッセージの保留判定の流れ
通常,同期型メッセージの送受信関数の発行時に指定した監視タイマがタイムアウトすると,コネクションは切断されます。しかし,システム定義の指定によっては,コネクションの切断を抑止することができます。
ここでは,コネクションの切断抑止の概要,およびタイムアウト発生時の動作について説明します。
コネクションの切断抑止では,送受信関数がタイムアウトした場合のコネクション切断,およびCERREVTの起動を行いません。コネクションの切断を抑止するかどうかは,コネクション定義(mcftalccn -w)のsrtimoutオペランドで指定します。
コネクションの切断を抑止する場合は,入力セグメント判定UOCでの後続メッセージ監視を行わないでください。
dc_mcf_sendrecv関数がタイムアウトした場合の,コネクションの切断抑止の概要を,次の図に示します。
図2-38 コネクションの切断抑止の概要
メッセージの送受信関数のタイムアウト発生時の動作を,次の表に示します。
表2-6 メッセージの送受信関数タイムアウト発生時の動作
項番 | 項目 | コネクション定義(mcftalccn -w)の指定による動作 | |
---|---|---|---|
srtimoutオペランドにyesを指定 (コネクションの切断を抑止する) | srtimoutオペランドにnoを指定 (コネクションの切断を抑止しない) | ||
1 | コネクション | コネクションを切断しません。 | コネクションを切断します。 |
2 | CERREVT | 起動しません。 | 起動します。 次に示す内容を通知します。
|
3 | リターン値 | DCMCFRTN_73005(監視タイマタイムアウト)が返されます。 | |
4 | ステータスコード | 73005(監視タイマタイムアウト)が返されます。 |