5

我正在使用 Servlet 3.0 的javax.servlet.AsyncContext接口实现服务器发送事件。

但是我不明白我应该如何处理 I/O 错误,比如对等断开连接。

对于给定的AsyncContext ac = request.startAsync(),我可以打电话ac.getResponse().getWriter().print(something),然后ac.getResponse.getWriter().flush()它工作正常。但是,当客户端断开连接时,我没有收到错误 - 即使我附加了一个侦听器,它的onError方法也不会被调用。

我使用 Jetty 8 和 Tomcat 7 对其进行了测试,似乎没有将与客户端的断开连接报告回应用程序。

可以做些什么来检测通信错误?

4

2 回答 2

4

问题是:ac.getResponse.getWriter().flush()不扔IOException

因此,为了在 I/O 操作时获得错误通知,您需要ServletOutputStream改用:

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 回答