ApacheCXFWebサービススタックを使用しています。操作が完了する前にクライアントがタイムアウトしたりサーバーから切断したりすると、サーバーは操作が完了するまで操作を実行し続けます。クライアントが切断したことをサーバーに検出させ、それに応じて処理させたいと思います。
クライアントがApacheCXFを使用して切断したことを検出する方法はありますか?他のJavaWebサービススタックを使用するのはどうですか?
ApacheCXFWebサービススタックを使用しています。操作が完了する前にクライアントがタイムアウトしたりサーバーから切断したりすると、サーバーは操作が完了するまで操作を実行し続けます。クライアントが切断したことをサーバーに検出させ、それに応じて処理させたいと思います。
クライアントがApacheCXFを使用して切断したことを検出する方法はありますか?他のJavaWebサービススタックを使用するのはどうですか?
私はApacheCXFに精通していませんが、以下はJavaサーブレットベースのフレームワークに適用できるはずです。
ユーザーが切断したかどうか(停止ボタン、ブラウザを閉じたなど)を判断するために、サーバーはパケットの送信を試行する必要があります。TCP / IP接続が閉じられている場合は、IOException
がスローされます。
理論的には、Javaアプリケーションは、処理中のさまざまなポイントでスペース文字を送信できます。IOException
クライアントが終了し、処理を中止できることを通知します。
ただし、この手法にはいくつかの問題がある可能性があります。
処理中に文字を送信すると応答が「コミット」されるため、長時間のサーバーサイド処理の結果に基づいてHTTPヘッダーやCookieなどを設定できない場合があります。
出力ストリームがバッファリングされている場合、スペース文字はすぐには送信されないため、適切なテストが実行されません。回避策として使用できる場合がありますflush()
。
特定のフレームワークまたはビューテクノロジ(JSPなど)にこの手法を実装するのは難しい場合があります。たとえば、応答がコミットされた後、ページレンダリングコードはコンテンツタイプを送信できなくなります。