使用Java和JBoss进行长轮询

时间:2010-10-21 10:38:13

标签: jboss java-ee ejb-3.0 comet

我正在寻找一个例子,如何在java中实现longpoling机制。我很想使用无状态EJB。

我知道类似的东西会起作用:

@WebService(serviceName="mywebservice")
@Stateless
public class MyWebService {
    @WebMethod
    public String longPoll() {
         short ct = 0;
         while(someCondition == false && ct < 60) {
             sleep(1000);  // 1 sec
             ct++;
         }
         if (someCondition)
             return "got value";
         else
             return "";
    }
}

不幸的是,我知道这不具备规模。我可以在网络方法中返回而不完成响应并在其他地方完成它吗?

2 个答案:

答案 0 :(得分:3)

JAX-WS支持使用异步客户端调用调用Web服务,并支持回调和轮询模型。看看:

答案 1 :(得分:2)

您尝试实施的内容称为服务器推送。 每个网络服务器/应用服务器都有一个线程池,比如用于处理网络请求的10个线程,如果所有这些线程都进入“休眠状态”,那么在其中一个“休眠”存在之前,其他任何网络请求都不会得到服务。一些解决方案是增加这些线程的数量,但随后您将占用更多内存和更多操作系统资源(每个线程成本)。所以,是的,'服务器推送'的实现是不可扩展的。

解决方案:

  • 您的网络应用程序每隔(比如说)5秒发送一次http请求,以检查您的'someCondition'是否已更改,然后获取数据
  • AFAIK,Tomcat(也是JBoss)已经有一些'连接器'来支持这样的请求,因此不需要Thread.sleep()或信号量
  • 使用最新的Web服务器实现Servlet API 3,它也支持这种长时间运行的HTTP请求
  • 了解详情:Online tutorials for implementing comets (server push)