使用Java和JBoss进行长轮询

使用Java和JBoss进行长轮询,jboss,jakarta-ee,ejb-3.0,comet,Jboss,Jakarta 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 &&a

我正在寻找一个例子,如何在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 "";
    }
}
@WebService(serviceName=“mywebservice”)
@无国籍
公共类MyWebService{
@网络方法
公共字符串longPoll(){
短ct=0;
while(someCondition==false&&ct<60){
睡眠(1000);//1秒
ct++;
}
如果(某些条件)
返回“got value”;
其他的
返回“”;
}
}

不幸的是,我知道,这是不可伸缩的。我可以在不完成响应的情况下返回webmethod并在其他地方完成它吗?

您尝试实现的东西被称为服务器推送。 每个web服务器/appserver都有一个线程池,比如10个线程用于处理web请求,如果所有这些线程都进入“睡眠”,则在其中一个“睡眠”存在之前,不会为其他web请求提供服务。一些解决方案是增加这些线程的数量,但这样会消耗更多内存和更多操作系统资源(每个线程的成本)。因此,是的,“服务器推送”的实现是不可伸缩的

解决方案:

  • 您的web应用程序可以每隔(比如)5秒发送一个http请求,以检查您的“someCondition”是否更改,然后获取数据
  • 好了,Tomcat(也包括JBoss)已经有了一些“连接器”来支持这样的请求,所以不需要Thread.sleep()或信号量
  • 使用实现ServletAPI3的最新web服务器,它还支持这种长时间运行的HTTP请求
  • 阅读更多:

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


    • 特别是

我知道我的示例无法扩展。你指的连接器似乎就是APR连接器。不幸的是,我找不到关于如何使用连接器的更多信息。我认为这些链接应该对您有所帮助:。还要记住Servlet3API(它很快就会成为标准)。告诉我们你的结果。我删除了JAX WS标签,因为这个问题不是关于JAX-WS…如果这是一个错误,如果这个问题看起来是关于JAX-WS的,那么回滚(但是在这种情况下,你应该考虑使用JAX-WS支持,如我的回答中提到的)。