在HttpServlet中检测中止的请求

在HttpServlet中检测中止的请求,http,servlets,abort,Http,Servlets,Abort,有没有办法确定HttpServletRequest是否被中止 我正在编写一个即时浏览器应用程序(某种聊天):客户端使用AJAX HTTP请求在循环中请求新事件。服务器(Tomcat)处理HttpServlet中的请求。如果此客户端没有新事件,服务器将延迟回复,直到新事件到达或超时(30秒) 现在我想确定不再轮询的客户端。因此,我在一个请求结束时启动一个kick计时器,当一个新请求到达时停止。如果客户端关闭浏览器窗口,则TCP连接将关闭,HTTP请求将中止 问题:客户机没有运行到kick Time

有没有办法确定HttpServletRequest是否被中止

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

现在我想确定不再轮询的客户端。因此,我在一个请求结束时启动一个kick计时器,当一个新请求到达时停止。如果客户端关闭浏览器窗口,则TCP连接将关闭,HTTP请求将中止

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


如果我能够以某种方式侦听连接中止事件,然后通知等待的请求以停止它,那将是非常棒的。但是我在HttpServletRequest或HttpServletResponse中找不到类似的东西…

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

您可能正在使用某种线程通知(信号量或Object.wait)来保持和释放Servlet线程。在等待中添加一个超时(~10秒),然后检查连接是否仍然存在,然后继续等待10秒(如果连接仍然存在)


我不知道是否有可靠的方法来轮询连接的“活跃度”(例如resp.getOutputStream不引发异常),如果有,哪种方法是最好的(最可靠,CPU占用最少)。

这可能对操作没有任何帮助,但它可能会帮助其他人在HttpServlet中检测中止的HTTP连接,因为我遇到了类似的问题,并最终找到了答案


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

谢谢您的回答。我知道开放连接的这一缺点。问题是,我希望当事件发生时,客户能够很快得到通知。如果我不使用等待方法,轮询间隔就必须很小。这又会导致大量的交通…啊,我明白了。可能有一种方法可以检查中止(对不起,我不确定)。像Comet这样的推送技术,或者包裹Comet的东西,看起来很理想。是的,我基本上是在尝试自己实现这个概念,以获得更大的灵活性。即时方面工作正常,但开/关意识滞后于中止意识。感谢您的评论。:-)您使用什么API/框架来处理异步请求和/或HTTP推送?您的问题听起来/读起来非常奇怪,因为标准Servlet API通常不是这样工作的,所以我猜您正在使用一些API/框架来实现这一点(例如Comet、Atmosphere、Servlet 3.0 async等)。要么就是这样,要么就是你做错了。我没有使用任何框架。简单如下:::::UpdateServlet doGet方法(1)从会话获取updateClient(2)从updateClient获取列表(3)打印编码事件:UpdateClient getEvents方法(1)在没有事件等待时等待(2)返回事件:UpdateClient addEvent方法(1)将事件添加到列表中(2)通知等待的线程在不同的线程中并发处理请求。这可以很好地即时工作。:-)不管怎样,你问题中的术语肯定令人困惑。