Hitachi

OpenTP1 Version 7 分散トランザクション処理機能 OpenTP1 プロトコル TP1/NET/TCP/IP編


2.1.9 コネクション障害

ネットワーク障害または自システム内の異常によって,メッセージ送受信中にコネクション障害を検出すると,コネクションが解放され,メッセージを送受信できなくなります。このように,オンライン終了時を除いて,運用コマンドやAPIを使用しないでコネクションが解放されることを,コネクションの切断といいます。

ここでは,コネクションの切断と,相手アドレス指定時,または相手アドレスチェックの抑止時のコネクション障害について説明します。

〈この項の構成〉

(1) コネクションの切断

TP1/NET/TCP/IPは障害通知イベント(CERREVT)によって,障害の発生とコネクションの切断を通知します。送信中の場合,該当メッセージはコネクション再確立後に再送されますが,受信中の場合,該当メッセージは破棄されます。

コネクション障害時の対策については,「9.2 コネクション障害時の処理」を参照してください。

コネクションの切断を,次の図に示します。

図2‒18 コネクションの切断

[図データ]

主に障害の検出によって自システムからコネクションを解放する場合,コネクション定義(mcftalccn -f)のcnreleaseオペランドを指定することで,コネクションの解放形態を指定できます。解放形態には,FINパケットを送信してコネクションを解放する形態(finを指定)と,RSTパケットを送信して強制的にコネクションを解放する形態(rstを指定)があります。コネクションを解放する要因と送信するパケットを次の表に示します。

表2‒2 コネクションの解放要因と送信するパケット

コネクションの解放要因

コネクション定義(mcftalccn -f)のcnreleaseオペランドの指定値

送信するパケット

mcftdctcnコマンド

-fオプションなし

任意

FINパケット

-fオプションあり

fin

FINパケット

rst

RSTパケット

API(dc_mcf_tdctcn関数またはCBLDCMCF('TDCTCN△△'))

強制解放オプションなし※1

任意

FINパケット

強制解放オプションあり※2

fin

FINパケット

rst

RSTパケット

相手システムからの解放

任意

FINパケット

OpenTP1終了

  • 正常終了

  • 強制正常終了

  • 計画停止A

  • 計画停止B

  • MCF構成変更準備停止

任意

FINパケット

強制停止

fin

FINパケット※3

rst

RSTパケット

障害の検出

サーバ型コネクションの確立拒否

任意

FINパケット

上記以外(受信バッファ数不足,後続セグメント受信監視タイムアウトなど)

fin

FINパケット

rst

RSTパケット

注※1

dc_mcf_tdctcn関数の場合,action引数にDCMCFFRCを指定しません。

CBLDCMCF('TDCTCN△△')の場合,データ名D1に空白または'0'を指定します。

注※2

dc_mcf_tdctcn関数の場合,action引数にDCMCFFRCを指定します。

CBLDCMCF('TDCTCN△△')の場合,データ名D1に'1'を指定します。

注※3

Windowsの場合,RSTパケットを送信します。

注意事項
  • TP1/NET/TCP/IPはOSが提供するTCP/IPのソケットインタフェースを利用しています。そのため,FINパケットを送信する指定をしていても,ネットワーク上のデータのすれ違いなどによって,TP1/NET/TCP/IPの指示と関係なくOSがRSTパケットを送信する場合があります。

  • RSTパケットによるコネクション解放の場合,TCP/IPソケットの送信バッファに蓄積されている送信メッセージがコネクション解放時に破棄されます。送信メッセージが相手システムに到達してからコネクションを解放する場合は,メッセージの送達を確認してからコネクションを解放してください。送達確認については,「2.3.10 メッセージ送達の確認」を参照してください。

(2) 相手アドレス指定時,または相手アドレスチェックの抑止時のコネクション障害

次に示す場合,TP1/NET/TCP/IPは,コネクションの切断後にどの相手システムとコネクションを確立するか特定できません。

このような場合に出力キューまたは入力キューにメッセージがあるときは,次のことに注意する必要があります。

(a) コネクション障害時に出力キューにメッセージがある場合

いったんコネクションが解放されると,そのコネクションは次にどの相手システムと接続するのか特定できないため,現在出力キューにあるメッセージが本来のあて先でない相手に送信される場合があります。

このため,コネクション確立前に,出力キューに残っている不要なメッセージを運用コマンド(mcftdlqle)の入力,またはAPI(dc_mcf_tdlqle関数もしくはCBLDCMCF('TDLQLE△△'))の発行によって削除するようにしてください。ただし,出力キューに残っている不要なメッセージを削除するタイミングよりも早く,別の相手システムと接続されてメッセージが送信されてしまう場合があります。相手システムが不要なメッセージを受信してしまった場合は,メッセージ受信後にそのメッセージを破棄してください。

コネクション障害時に出力キューにメッセージがあるときの流れを,dc_mcf_send関数を使用する場合を例に次の図に示します。

図2‒19 コネクション障害時に出力キューにメッセージがある場合の流れ

[図データ]

なお,MHPからメッセージを送信する場合は,コネクション再確立時に未送信メッセージの送信を抑止できます。詳細については,「2.3.12 コネクション再確立時の未送信メッセージの送信抑止」を参照してください。

(b) コネクション障害時に入力キューにメッセージがある場合

いったんコネクションが解放されると,そのコネクションは次にどの相手システムと接続するのかを特定できないため,現在入力キューにあるメッセージが,現在接続している相手システムから送信されたものではない場合があります。したがって,UAP側で,メッセージ内容などからどの相手システムから送信されたメッセージなのかを判断する必要があります。

コネクション障害後に入力キューからメッセージを取り出したときの流れを,dc_mcf_receive関数を使用する場合を例に次の図に示します。

図2‒20 コネクション障害後に入力キューからメッセージを取り出した場合の流れ

[図データ]