10.4.4 ユーザサーバのコネクション切断検知
クライアントUAPとサーバUAPとの間で確立したコネクションは,次のサービス要求のときに再度使用します。
このコネクションは,UAPを停止したときに切断されますが,停止したUAPがクライアントUAPの場合,コネクションが切断されたことにサーバUAPが気付かないことがあります。
そのような状態でクライアントUAPからのサービス要求を受けた場合,応答を送信したときに,メッセージの吸い込み(送信元ではメッセージの送信に成功したように見えるものの,実際には送信に失敗する事象)が発生します。
また,コネクションを確立した状態で相手先のマシンがダウンした場合,RSTパケットが送信されないため,コネクションの切断を検知できません。この場合も,切断されたコネクションを使用してメッセージを送信すると,メッセージの吸い込みが発生します。
-
クライアントUAP-AからサーバUAPへサービス要求をする。
-
サーバUAPからクライアントUAP-Aへ応答を返す。
-
クライアントUAP-Aを停止し,コネクションを切断する。
このとき,サーバUAPはサービス要求の受信待ちのため,コネクションの切断に気付けない。
-
クライアントUAP-Bを起動し,サーバUAPへサービス要求をする。
このとき,クライアントUAP-Bの受信ポートに,停止したクライアントUAP-Aと同じ受信ポート10000が割り当たる。
-
サーバUAPは,停止したクライアントUAP-Aとの間で確立したコネクションを使用して応答を送信するが,3.でコネクションが切断されているため,送信に失敗する。
この現象を軽減するため,サーバUAP側のユーザサービス定義に次のオペランドを指定し,コネクション切断の監視をしてください。
-
polling_control_dataオペランドにYを指定
-
thread_yield_intervalオペランドに監視間隔時間を指定
なお,thread_yield_intervalオペランドには最大値を指定しないでください。
最大値を指定した場合,コネクション切断の監視はしません。
オペランドの詳細については,マニュアル「OpenTP1 システム定義」のユーザサービス定義のpolling_control_dataオペランド,およびthread_yield_intervalオペランドを参照してください。