5

サーブレット3.0のjavax.servlet.AsyncContextインターフェースを使用してサーバー送信イベントを実装しています。

ただし、ピア切断などのI/Oエラーをどのように処理する必要があるのか​​理解できません。

与えられた、私はそれからAsyncContext ac = request.startAsync()呼び出すことができ、それはうまくいきます。ただし、クライアントが切断されてもエラーは発生しません。リスナーをアタッチしても、そのメソッドは呼び出されません。ac.getResponse().getWriter().print(something)ac.getResponse.getWriter().flush()onError

Jetty8とTomcat7の両方でテストしましたが、クライアントからの切断がアプリケーションに報告されていないようです。

通信エラーを検出するにはどうすればよいですか?

4

2 に答える 2

4

問題は次のとおりです。ac.getResponse.getWriter().flush()スローしませんIOException

ServletOutputStreamそのため、I/O 操作時にエラー通知を受け取るには、代わりに次を使用する必要があります。

try {
   ServletOutputStream out = ac.getResponse().getOutputStream();
   out.print(stuff);
   out.flush(); // throws IOException
}
catch(IOException e) {
   // handle a error
}
于 2012-08-21T09:16:10.090 に答える
1

使用する方が便利な場合は、別の解決策がありますgetWriter()

PrintWriter out = ac.getResponse().getWriter();
out.print(stuff);
out.flush(); // swallows IOException
if (out.checkError()) {
   // handle error or throw out...
}

つまり、PrintWriter クラスには、後で書き込みエラーを取得するためのメソッドが用意されています。

于 2013-04-30T14:27:09.960 に答える