7

Java NIO API を使用してノンブロッキング IO を実行するサーバーを作成しました。時折、クライアント アプリケーションが突然シャットダウンし (停電などにより)、接続がサーバー側で開いたままになる状況が見られます。

同僚が同じ問題に遭遇し、この種のことを検出するために回線上のハートビートを使用していると言いましたが、もっと簡単な方法があることを願っています。他の誰かがこの問題に遭遇しましたか?

IOException追加情報: 私の現在のサーバー設計では、読み取り/書き込み操作を試行するときにキーがキャッチされると、キーがキャンセルされ、対応するチャネルが閉じられます。このアプローチは 99% の確率で機能するようです。接続が開いたままになっているように見える状況は、ほんの一握りしか見たことがありません。

4

1 に答える 1

6

アプリ レベルのハートビートがなければ、唯一のオプションは TCP キープアライブに依存することです。ただし、デフォルトの間隔は非常に長い (2 時間など)。RFC では、2 時間未満の間隔は推奨されていません。

短くすることはできますが、これはシステム全体のパラメーターです。一部の OS では、これを変更するためにカーネルの再構築が必要になります。

したがって、TCP ベースのプロトコルにはハートビートを強くお勧めします。

于 2009-09-30T14:45:11.657 に答える