2

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

4

2 回答 2

4

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

[原来的]

servlet 3.0 规范为进行这种异步处理提供了一个标准。谷歌“servlet 3.0 异步”。Tomcat 7 支持这一点。我猜 Jetty 也有,但我没用过。

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

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

于 2012-10-10T19:28:03.067 回答
1

不确定这是否是您想要的最佳解决方案,但通常如果您想在 java 中定期执行此操作,您可以使用ScheduleExecutorService。API 文档顶部有一个很好的示例。TimeUnit是一个很好的枚举,因为您可以轻松清晰地指定周期时间。因此,您可以指定它每 x 分钟、几小时等运行一次

于 2012-10-10T19:09:56.203 回答