httpresponseがまだ「生きている」かどうかをJavaサーブレットから確認する方法はありますか? たとえば、私の状況では、ブラウザからサーブレットに ajax リクエストを送信します。この場合はポーリング リクエストなので、最大 5 分間ポーリングすることができます。サーブレットがデータで応答する準備ができたら、ユーザーがブラウザ ウィンドウを閉じたか、別のページに移動したかなどを確認したいと思います。つまり、応答にデータを送信して実際に何かが行われるかどうかを確認してください。
2 に答える
Java Servlet Response には、リクエストとレスポンスの動作に基づいているため、そのようなメソッドはありません。ステータスを確認したい場合は、おそらく、以下のようにいくつかのステータス確認方法があるTCP/IP Socketsなどの下位レベルで作業する必要があります。
boolean isBound()
Returns the binding state of the socket.
boolean isClosed()
Returns the closed state of the socket.
boolean isConnected()
Returns the connection state of the socket.
boolean isInputShutdown()
Returns whether the read-half of the socket connection is closed.
boolean isOutputShutdown()
Returns whether the write-half of the socket connection is closed.
通常、この問題は、実際のメッセージの前にダミーのペイロードを送信することで解決できます。
ソケットが切断された場合は、IOException
またはSocketException
類似のものがスローされます (ライブラリによって異なります)。技術的には、ブラウザは、ページから移動したり、ブラウザを閉じたり (または同様のもの) したりするたびに接続を切断することになっていますが、実装の詳細が異なる場合があることがわかりました。たとえば、古いバージョンの FF は、ページから移動するときに適切に接続を閉じますが、新しいバージョン (特に AJAX を使用する場合) では、接続を開いたままにする傾向があります。
これが、実際のメッセージの前にダミー パケットを使用する主な理由です。もう 1 つの重要な考慮事項は、タイムアウトです。以前にポーリングを行ったことがありますが、接続を維持するために何らかのハートビートを実装するか、サーバーのタイムアウトを増やす必要があります (ただし、一部のブラウザーにはタイムアウトがある場合があります-制御できないタイムアウト)。
AJAX をポーリングまたはプッシュする代わりに、Websocket ソリューションを (少なくとも部分的に) サポートすることを強くお勧めします。