检测HttpServlet中的已中止请求

时间:2010-12-06 23:01:16

标签: http servlets abort

有没有办法找出HttpServletRequest是否被中止?

我正在编写一个即时浏览器应用程序(某种聊天):客户端使用AJAX-HTTP-Requests在循环中请求新事件。服务器(Tomcat)处理HttpServlet中的请求。如果此客户端没有新事件,则服务器会延迟回复,直到新事件到达或发生超时(30秒)。

现在我想识别不再轮询的客户端。因此,我在请求结束时启动kick-Timer,当新请求到达时停止。如果客户端关闭浏览器窗口,则TCP-Connection将关闭,HTTP-Request将被中止。

问题:客户端没有遇到kick-Timeout,因为Servlet仍处理事件请求 - 正在休眠并等待事件或超时。

如果我能以某种方式监听连接中止事件然后通知等待请求以便停止它将会很棒。但我在HttpServletRequest或HttpServletResponse中找不到类似的东西......

3 个答案:

答案 0 :(得分:1)

您可能正在使用某种线程通知(Semaphores或Object.wait)来保存和释放Servlet线程。如何在等待中添加超时(~10s),然后以某种方式检查连接是否仍处于活动状态,然后继续等待另外10秒,如果连接仍在那里。

我不知道是否有可靠的方法来轮询连接的“活跃性”(例如resp.getOutputStream没有抛出异常),如果是,那么哪种方式最好(最可靠,CPU密集度最低)。

答案 1 :(得分:1)

这可能不再对OP有所帮助,但它可能通常会帮助其他尝试检测HttpServlet中中止的HTTP连接的人,因为我遇到了类似的问题,并最终找到了答案。

关键是当客户端取消请求时,通常服务器发现的唯一方法是将一些数据发送回客户端,在这种情况下将失败。我想检测客户端何时停止等待服务器上的长时间计算,因此我最终通过HttpServletResponse的编写器向响应正文中定期写入一个字符。要强制将数据发送到客户端,必须调用HttpServletResponse.flushBuffer(),如果连接异常终止,则会抛出ClientAbortException

答案 2 :(得分:0)

似乎有等待请求会很快降低系统性能。如果请求保持打开状态,响应请求的线程将被快速用完。您可以尝试完成所有请求(如果没有消息,则向客户端返回“null”),并在后端有一个线程,用于跟踪自客户端轮询以来的时间。该线程可以将客户端标记为不活动。