Java Long Polling:单独的线程?

时间:2012-10-10 19:06:21

标签: java long-polling

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

2 个答案:

答案 0 :(得分:3)

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

[原始]

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

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

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

答案 1 :(得分:1)

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