2.3.12 コネクション再確立時の未送信メッセージの送信抑止
(1) コネクション再確立時の未送信メッセージの送信抑止の概要
コネクション再確立時の未送信メッセージの送信抑止は,MHPからメッセージ送受信関数を発行したときに,TP1/NET/TCP/IPがコネクションの再確立の有無をチェックし,再確立前の古いコネクションで受信したメッセージに対する一方送信メッセージの送信や同期型の関数の発行を抑止する機能です。
この機能を使用すると,UAPや相手システムで不要なメッセージを削除する必要がなくなるため,TP1/NET/TCP/IPを使用したシステムの開発が容易になります。
一方送信メッセージの送信を抑止した場合,送受信メッセージ廃棄通知イベント(MDELEVT)を通知します。MDELEVTを通知するには,MCFアプリケーション定義でMDELEVTを定義しておく必要があります。
同期型の関数の発行を抑止した場合,MDELEVTは起動しません。
なお,応答メッセージについては,この機能の使用に関係なく,コネクションが再確立すると応答メッセージの送信が抑止されます。このとき,MDELEVTは起動しません。
- 注意
- 一方送信メッセージの送信を抑止した場合,TP1/NET/TCP/IPは相手システムにメッセージを送信したと見なしません。そのため,次の点に注意してください。
- AJ(メッセージ送信完了ジャーナル)を取得する(論理端末定義(mcftalcle -o)のajオペランドを省略,またはyesを指定)場合,AJを取得しません。
- コネクションの無通信状態を監視している場合(コネクション定義(mcftalccn -k)のnotrftimeオペランドに0以外の値を指定),状態監視の経過時間をリセットしません。
(2) 送信抑止ルール
この機能が有効となるか無効となるかは,メッセージ送受信関数を発行したUAPの種類,UAPの起動要因,入力元論理端末とメッセージ送受信関数を発行した論理端末の差異に依存します。各々の条件で機能が有効となるか無効となるかを次の表に示します。
表2-8 送信抑止の実行条件
UAPの種類 | UAPの起動要因 | 入力元論理端末と関数発行先論理端末の差異 | 送信の抑止 |
---|
MHP | mcfuevtコマンド | - | × |
上記以外 | 同じ | ○ |
異なる | × |
SPP | - | - | × |
- (凡例)
- ○:有効です(送信は抑止されます)。
- ×:無効です(送信は抑止されません)。
- -:該当しません。
(3) 入力元論理端末と同じ論理端末にメッセージ送受信関数を発行した場合
(a) 一方送信メッセージの送信の場合
TP1/NET/TCP/IPが一方送信メッセージを受信してから,一方送信メッセージを受信したMHPで,入力元論理端末と同じ論理端末に一方送信メッセージを送信するまでの間に,コネクションの解放と再確立が発生した場合,TP1/NET/TCP/IPはメッセージを破棄し,MDELEVTを通知します。
入力元論理端末と同じ論理端末への一方送信メッセージの送信関数発行を,dc_mcf_send関数を使用する場合を例に,次の図に示します。
図2-57 入力元論理端末と同じ論理端末で一方送信メッセージの送信関数を発行したときの処理の流れ
![[図データ]](figure/zu025100.gif)
- 相手システムA(コネクション名:CN_A)からメッセージを受信します。
- dc_mcf_receive関数を発行してメッセージを受け取ります。
- コネクションCN_Aを解放します。
- CN_Aが相手システムBとコネクションを再確立します。
- dc_mcf_send関数を発行して出力キューにメッセージを格納します。
- 論理端末の閉塞解除を契機に,出力キューからメッセージを読み出します。
- TP1/NET/TCP/IPがコネクションの再確立を検出したため,出力キューのメッセージを破棄します。
- MDELEVTを起動します。
(b) 同期型メッセージの送信または同期型メッセージの送受信の場合
TP1/NET/TCP/IPが一方送信メッセージを受信してから,一方送信メッセージを受信したMHPで,入力元論理端末と同じ論理端末に,同期型メッセージの送信関数または同期型メッセージの送受信関数を発行するまでの間に,コネクションの解放と再確立が発生した場合,発行した関数はリターン値DCMCFRTN_73002またはステータスコード73002でエラーリターンし,送信メッセージを破棄します。
入力元論理端末と同じ論理端末への同期型メッセージの送信関数または同期型メッセージの送受信関数発行を,dc_mcf_sendsync関数を使用する場合を例に,次の図に示します。
図2-58 入力元論理端末と同じ論理端末で同期型メッセージの送信関数を発行したときの処理の流れ
![[図データ]](figure/zu025200.gif)
- 相手システムA(コネクション名:CN_A)からメッセージを受信します。
- dc_mcf_receive関数を発行してメッセージを受け取ります。
- コネクションCN_Aを解放します。
- CN_Aが相手システムBとコネクションを再確立します。
- dc_mcf_sendsync関数を発行して同期型メッセージを送信します。
- TP1/NET/TCP/IPがコネクションの再確立を検出したため,メッセージを破棄してMHPにリターン値DCMCFRTN_73002でエラーリターンします。
(c) 同期型メッセージの受信の場合
TP1/NET/TCP/IPが一方送信メッセージを受信してから,一方送信メッセージを受信したMHPで,入力元論理端末と同じ論理端末に同期型メッセージの受信関数を発行するまでの間に,コネクションの解放と再確立が発生した場合,発行した関数はリターン値DCMCFRTN_73002またはステータスコード73002でエラーリターンします。
入力元論理端末と同じ論理端末への同期型メッセージの受信関数発行を,dc_mcf_recvsync関数を使用する場合を例に,次の図に示します。
図2-59 入力元論理端末と同じ論理端末で同期型メッセージの受信関数を発行したときの処理の流れ
![[図データ]](figure/zu025300.gif)
- 相手システムA(コネクション名:CN_A)からメッセージを受信します。
- dc_mcf_receive関数を発行してメッセージを受け取ります。
- コネクションCN_Aを解放します。
- CN_Aが相手システムBとコネクションを再確立します。
- dc_mcf_recvsync関数を発行して同期型メッセージの受信を要求します。
- TP1/NET/TCP/IPがコネクションの再確立を検出したため,MHPにリターン値DCMCFRTN_73002でエラーリターンします。
(4) 入力元論理端末と異なる論理端末でメッセージ送受信関数を発行した場合
TP1/NET/TCP/IPが一方送信メッセージを受信してから,一方送信メッセージを受信したMHPで,入力元論理端末と異なる論理端末にメッセージ送受信関数を発行した場合,TP1/NET/TCP/IPは相手システムとのコネクションが再確立したかどうかをチェックしません。
入力元論理端末と異なる論理端末へのメッセージ送受信関数発行を,dc_mcf_send関数を使用する場合を例に,次の図に示します。
図2-60 入力元論理端末と異なる論理端末でメッセージ送受信関数を発行したときの処理の流れ
![[図データ]](figure/zu025400.gif)
- 相手システムA(コネクション名:CN_A)からメッセージを受信します。
- dc_mcf_receive関数を発行してメッセージを受け取ります。
- 相手システムB(コネクション名:CN_B)とコネクションを確立します。
- dc_mcf_send関数を発行してCN_Bに対応する論理端末Bの出力キューにメッセージを格納します。
- 論理端末の閉塞解除を契機に出力キューからメッセージを読み出します。
- 入力元の論理端末と異なるため,コネクションが再確立したかどうかをチェックしないで,相手システムBにメッセージを送信します。
(5) SPPからメッセージ送受信関数を発行した場合
SPPからメッセージ送受信関数を発行した場合,TP1/NET/TCP/IPはコネクションが再確立したかどうかをチェックしません。
SPPからのメッセージ送受信関数発行を,dc_mcf_send関数を使用する場合を例に次の図に示します。
図2-61 SPPからメッセージ送受信関数を発行したときの処理の流れ
![[図データ]](figure/zu025500.gif)
- 相手システムA(コネクション名:CN_A)からメッセージを受信します。
- dc_mcf_receive関数を発行してメッセージを受け取ります。
- dc_rpc_call関数を発行してSPPを起動します。
- コネクションCN_Aを解放します。
- CN_Aが相手システムBとコネクションを再確立します。
- dc_mcf_send関数を発行して出力キューにメッセージを格納します。
- 論理端末の閉塞解除を契機に,出力キューからメッセージを読み出します。
- メッセージ送受信関数を発行したUAPの種類がSPPのため,コネクションが再確立したかどうかをチェックしないで,相手システムBにメッセージを送信します。
(6) アプリケーションプログラムの起動によって起動されたMHPからメッセージ送受信関数を発行した場合
TP1/NET/TCP/IPが一方送信メッセージを受信してから,一方送信メッセージを受信したMHPからアプリケーションプログラムの起動によって起動されたMHPで,入力元論理端末と同じ論理端末でメッセージ送受信関数を発行するまでの間に,コネクションの解放と再確立が発生した場合,一方送信メッセージを受信したMHPからメッセージ送受信関数を発行したときと同様に送信を抑止します。
アプリケーションプログラムの起動によって起動されたMHPからのメッセージ送受信関数発行を,dc_mcf_send関数を使用する場合を例に,次の図に示します。
図2-62 アプリケーションプログラムの起動によって起動されたMHPからメッセージ送受信関数を発行したときの処理の流れ
![[図データ]](figure/zu025600.gif)
- 相手システムA(コネクション名:CN_A)からメッセージを受信します。
- dc_mcf_receive関数を発行してメッセージを受け取ります。
- dc_mcf_execap関数を発行してMHPを起動します。
- コネクションCN_Aを解放します。
- CN_Aが相手システムBとコネクションを再確立します。
- dc_mcf_receive関数を発行してメッセージを受け取ります。
- dc_mcf_send関数を発行して出力キューにメッセージを格納します。
- 論理端末の閉塞解除を契機に,出力キューからメッセージを読み出します。
- TP1/NET/TCP/IPがコネクションの再確立を検出したため,出力キューのメッセージを破棄します。
- MDELEVTを起動します。
(7) MCFイベント処理用MHPからメッセージ送受信関数を発行した場合
TP1/NET/TCP/IPでMCFイベントを起動するイベントが発生してから,MCFイベント処理用MHPで,イベントが発生した論理端末と同じ論理端末でメッセージ送受信関数を発行するまでの間に,コネクションの解放と再確立が発生した場合,一方送信メッセージを受信したMHPからメッセージ送受信関数を発行したときと同様に送信を抑止します。
MCFイベント処理用MHPからのメッセージ送受信関数発行を,COPNEVTおよびERREVT1からdc_mcf_send関数を使用する場合を例に,次の図に示します。
(a) COPNEVTの場合
図2-63 COPNEVT処理用MHPからメッセージ送受信関数を発行したときの処理の流れ
![[図データ]](figure/zu025700.gif)
- 相手システムA(コネクション名:CN_A)とコネクションを確立します。
- COPNEVTを起動します。
- dc_mcf_receive関数を発行してメッセージを受け取ります。
- コネクションCN_Aを解放します。
- CN_Aが相手システムBとコネクションを再確立します。
- dc_mcf_send関数を発行して出力キューにメッセージを格納します。
- 論理端末の閉塞解除を契機に,出力キューからメッセージを読み出します。
- TP1/NET/TCP/IPがコネクションの再確立を検出したため,出力キューのメッセージを破棄します。
- MDELEVTを起動します。
(b) ERREVT1の場合
図2-64 ERREVT1処理用MHPからメッセージ送受信関数を発行したときの処理の流れ
![[図データ]](figure/zu025800.gif)
- 相手システムA(コネクション名:CN_A)からメッセージを受信し,アプリケーション名不正を検出します。
- ERREVT1を起動します。
- dc_mcf_receive関数を発行してメッセージを受け取ります。
- コネクションCN_Aを解放します。
- CN_Aが相手システムBとコネクションを再確立します。
- dc_mcf_send関数を発行して出力キューにメッセージを格納します。
- 論理端末の閉塞解除を契機に,出力キューからメッセージを読み出します。
- TP1/NET/TCP/IPがコネクションの再確立を検出したため,出力キューのメッセージを破棄します。
- MDELEVTを起動します。
(8) mcfuevtコマンドによって起動したMHPからメッセージ送受信関数を発行した場合
mcfuevtコマンドで起動されたMHPからメッセージ送受信関数を発行した場合,TP1/NET/TCP/IPは相手システムとのコネクションが再確立したかどうかをチェックしません。
mcfuevtコマンドで起動したMHPからのメッセージ送受信関数発行を,dc_mcf_send関数を使用する場合を例に,次の図に示します。
図2-65 mcfuevtコマンドより起動したMHPからメッセージ送受信関数を発行したときの処理の流れ
![[図データ]](figure/zu025900.gif)
- mcfuevtコマンドを入力してMHPを起動します。
- dc_mcf_receive関数を発行してメッセージを受け取ります。
- コネクションCN_Aを解放します。
- CN_Aが相手システムBとコネクションを再確立します。
- dc_mcf_send関数を発行して出力キューにメッセージを格納します。
- 論理端末の閉塞解除を契機に,出力キューからメッセージを読み出します。
- メッセージ送受信関数を発行したMHPがmcfuevtコマンドによって起動したため,コネクションが再確立したかどうかをチェックしないで,相手システムBにメッセージを送信します。