使用Java和JBoss进行长轮询
我正在寻找一个例子,如何在java中实现longpoling机制。我希望使用无状态EJB 我知道这样做是可行的:使用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
@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请求
- 阅读更多:
- 特别是