6

HttpServletRequest が中止されたかどうかを確認する方法はありますか?

私はインスタント ブラウザ アプリケーション (ある種のチャット) を作成しています。クライアントは、AJAX-HTTP-Requests を使用してループ内で新しいイベントを要求します。サーバー (Tomcat) は、HttpServlet でリクエストを処理します。このクライアントに新しいイベントがない場合、サーバーは、新しいイベントが到着するか、タイムアウトが発生するまで (30 秒) 応答を遅らせます。

ここで、ポーリングを行っていないクライアントを特定したいと考えています。したがって、リクエストの最後にキックタイマーを開始し、新しいリクエストが到着すると停止します。クライアントがブラウザ ウィンドウを閉じると、TCP 接続が閉じられ、HTTP 要求が中止されます。

問題:サーブレットが引き続きイベント要求を処理するため、クライアントはキック タイムアウトになりません。スリープ状態でイベントまたはタイムアウトを待機します。

どうにかして接続中止イベントをリッスンし、それを停止するために待機中のリクエストを通知できれば素晴らしいと思います。しかし、HttpServletRequestまたはHttpServletResponseでそのようなものを見つけることができませんでした...

4

3 に答える 3

1

おそらく、ある種のスレッド通知 (セマフォまたは Object.wait) を使用して、サーブレット スレッドを保持および解放しています。待機にタイムアウト (〜 10 秒) を追加してから、接続がまだ有効かどうかを何らかの方法で確認し、接続がまだ存在する場合はさらに 10 秒間待機を続けます。

接続の「活性」をポーリングする信頼できる方法があるかどうか (例: resp.getOutputStream が例外をスローしない) があるかどうかはわかりません。

于 2012-02-20T15:00:04.033 に答える
0

待機中のリクエストがあると、システムのパフォーマンスが急速に低下する可能性があるようです。リクエストが開いたままになっていると、リクエストに応答するスレッドがすぐに使い果たされてしまいます。すべてのリクエストを完了し (メッセージがない場合はクライアントに「null」を返す)、クライアントがポーリングしてから経過した時間を追跡するスレッドをバックエンドに置くことができます。スレッドは、クライアントを非アクティブとしてマークする可能性があります。

于 2010-12-06T23:16:22.373 に答える