Java 长轮询:单独的线程?

rya*_*dlf 2 java long-polling

由于浏览器兼容性问题,我决定使用长轮询来实现实时同步和通知系统。我在后端使用 Java,到目前为止我发现的所有示例都是 PHP。他们倾向于使用 while 循环和 sleep 方法。我如何在 Java 中复制这种事情?有一种Thread.sleep()方法,它导致我......我应该为每个发出民意调查的用户使用单独的线程吗?如果我不使用单独的线程,轮询请求是否会阻塞服务器?

Gui*_*one 6

[更新] 首先,是的,当然可以做一个简单的、长轮询的请求处理程序。请求到达服务器,然后在处理程序中循环或阻止,直到所需的信息可用,然后结束循环并提供信息。只要意识到对于每个长轮询客户端,是的,您将占用一个线程。这可能没问题,也许这就是您应该开始的方式。但是,如果您的 Web 服务器变得如此流行,以至于阻塞线程的绝对数量正在成为性能问题,请考虑使用异步解决方案,您可以在其中保持大量客户端请求挂起 - 它们的请求被阻塞,直到出现为止不会响应是有用的数据,无需为每个客户端占用一个或多个线程。

[原来的]

servlet 3.0 规范提供了执行此类异步处理的标准。谷歌“Servlet 3.0 异步”。Tomcat 7 支持此功能。我猜 Jetty 也有,但我没用过。

基本上,在您的 servlet 请求处理程序中,当您意识到需要执行一些“长”轮询时,您可以调用一个方法来创建异步上下文。然后您可以退出请求处理程序并且您的线程被释放,但是客户端仍然阻塞在请求上。无需任何睡眠或等待。

诀窍是将异步上下文存储在“方便”的地方。然后您的应用程序中发生了一些事情,并且您想要将数据推送到客户端,您需要找到该上下文,从中获取响应对象,写入您的内容并调用完成。响应将发送回客户端,而无需为每个客户端绑定一个线程。