【问题标题】:Java Long Polling: Separate Thread?Java 长轮询:单独的线程?
【发布时间】:2012-10-01 08:22:42
【问题描述】:

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

【问题讨论】:

  • 你真的想要长轮询(或)你可以接受反向 ajax(彗星)之类的东西吗?
  • 我真的很想实现我自己的轻量级服务,所以拿出来吧。但是,是的,基本上是反向 ajax。

标签: java long-polling


【解决方案1】:

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

【讨论】:

  • 我认为这在这种情况下效果不佳。它不一定需要按时间间隔执行。相反,它就像...虽然数据库没有返回任何结果...继续检查类似的事情。
  • 啊好的。感谢您对此的澄清
【解决方案2】:

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

[原创]

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

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

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

【讨论】:

  • 好吧,我一直认为它完成的方式是发送一个 ajax 请求并保持它对用户开放,然后在后端的类中运行一个循环,并在响应时响应请求可用的。你是在暗示我没有开放的 ajax 请求吗?
  • 查看更新。我的观点是,您可以为每个客户端保持打开请求,而不必占用线程。但是如果你愿意的话,你当然可以将一个线程捆绑在一个循环中。
  • 我得调查一下。这可能是我接受的答案。谢谢。
  • 使用什么类型的机制来搜索被阻止的响应,然后访问并返回相应的数据?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-10
  • 2013-02-28
  • 2013-09-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多