首页 \ 问答 \ 使用Java和JBoss进行长轮询(Long Polling with Java and JBoss)

使用Java和JBoss进行长轮询(Long Polling with Java and JBoss)

我正在寻找一个例子,如何在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 "";
    }
}

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


I'm looking for an example, how to implement a longpoling mechanism in java. I would love to use a stateless EJB.

I know that something like that would work:

@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 "";
    }
}

Unfortunately i know that this does'nt scale. Can i return in the webmethod without finishing the response and finish it somewhere else?


原文:https://stackoverflow.com/questions/3986529
更新时间:2019-09-11 17:57

最满意答案

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

解决方案:

  • 您的Web应用程序可以每隔(比如说)5秒发送一个http请求,以检查您的'someCondition'是否已更改,然后获取数据
  • AFAIK,Tomcat(也是JBoss)已经有一些'连接器'来支持这样的请求,因此不需要Thread.sleep()或信号量
  • 使用最新的Web服务器实现Servlet API 3,它也支持这种长时间运行的HTTP请求
  • 阅读更多: 实施彗星的在线教程(服务器推送)

The thing you're trying to implement is called server push. Each webserver/appserver has a pool of threads, say 10 threads for processing web requests, if all those threads will go into 'sleep' no other web request will be serviced until one of those 'sleeps' exists. Some solution is to increase number of those threads but then you'll eat more memory and more operating system resources (each thread costs). So yes, your implementation of 'server push' isn't scalable.

Solutions:

  • your web application can send a http request every (say) 5 secs, to check if your 'someCondition' changed, and then get the data
  • AFAIK, Tomcat (so JBoss too) already has some 'connector' for supporting such requests, so Thread.sleep() or semaphores won't be needed
  • use latest web server implementing Servlet API 3, it also has support for such long-running HTTP requests
  • read more: Online tutorials for implementing comets (server push)
2017-05-23

相关问答

更多

在JBoss AS 7.1上部署时出错(Error when deploying on JBoss AS 7.1)

从错误堆栈中您可以看到: Caused by: java.lang.ClassNotFoundException: org.apache.xalan.xslt.XSLTResultTarget from [Module "deployment.presto.war:main" from Service Module Loader] 所以加载的类jar文件来自默认的JBOSS模块,显然JBoss 7附带的xalan.jar(jboss-as-7.1.1.Final \ modules \

JBoss:将值绑定到JBoss EAP 6中的JNDI,类似于JNDIBindingServiceMgr(JBoss: Binding values into JNDI in JBoss EAP 6 similar to JNDIBindingServiceMgr)

您可以执行以下操作: standalone.xml: <subsystem xmlns="urn:jboss:domain:naming:1.2"> <bindings> <simple name="java:global/user" value="newUser"/> </bindings> </subsystem> 在春天的背景下: <bean class="java.util.Properties"> <constructor-arg>

JBoss 5.1.0.GA中的Hibernate 3.5-Final(Hibernate 3.5-Final in JBoss 5.1.0.GA)

看起来,JBoss提供的库依赖于休眠3.3的JPA1实现部分 是的,它确实(看到这个旧邮件得到一个想法),我认为你目前的做法是不可能的。 我的理解是JPA 2集成计划用于JBoss 5.2,但他们似乎决定跳过这个分支直接转到JBoss 6.x. It seems though that JBoss ships with libraries that are dependent on the JPA1 implementation part of the hibernate 3.3 Yes, it

JBoss Seam应用程序必须是EAR中的包吗?(Do JBoss Seam applications have to be packages in an EAR?)

在部署时共享错误消息会很有帮助。 Web应用程序(file.war)是否引用了不在file.war中的服务? 大多数项目都是作为耳朵部署的,因为ejb模块是单独打包的(参见下面的application.xml)。 看看运行它的原始JBoss 6服务器上的application.xml。 它可能除了war文件之外还有其他模块。 <application xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/20

从JBoss 7.1引用依赖Jar文件时出错(Error in Referencing a Dependency Jar File from JBoss 7.1)

您需要查看模块所需的依赖项。 使用当前错误消息,它看起来需要依赖SAX。 您可能应该为您的javax.api添加javax.api (这是SAX所在的模块)的依赖项。 <?xml version="1.0" encoding="UTF-8"?> <module xmlns="urn:jboss:module:1.1" name="common_libs.test"> <resources> <resource-root path="test.jar"/> </re

JSF(Mojarra)1.2在部署时导致java.lang.OutOfMemoryError(JSF (Mojarra) 1.2 causing java.lang.OutOfMemoryError on deploy)

问题解决了! 首先,我使用的是JBoss Seam 。 以这种方式在pom.xml上声明依赖项: <dependency> <groupId>org.jboss.seam</groupId> <artifactId>jboss-seam</artifactId> <version>2.2.2.Final</version> <scope>compile</scope> </dependency> 但是,JBoss Seam的依赖包括el-api.jar (版本1

JBoss部署错误 - 服务失败(JBoss Deployment Error - Failed Services)

好像是数据库连接问题。 请检查 如果数据库已接受连接。 任何防火墙,停止打开端口等 请检查jta =“true”或允许使用false并编写代码。 检查是否已将应用程序打包关联的jdbc驱动程序jar文件。 但是,是的,回答你的问题是; 此错误与数据库配置有关。 请检查相应的文档。 It seems like database connection issue. Please check If database is up for accepting connections. Any firewa

如何在MyEclipse配置Jboss

前提:java环境都已经配置好,而且已经安装了myeclipse插件。 1、把jboss下载下来,解压在某个目录(注意这个目录或其父目录不能包含空格,否则会有无法找到的错误) 2、配置服务器 1)点击MyEclipse选项。(仍旧在菜单栏的“windows”选项下的“preferences”下) 2)进入首选项对话框,左边找到myeclipse,选上 Enable,注意:server name 不要随便改动,点击应用。 3)选择jdk 4)配置launch,配置完成,点击确定。 5)在工具启动j

相关文章

更多

最新问答

更多
  • URL中此字符串格式的重要性是什么?(What's the significance of this string format in URLs?)
  • 如何创建矢量图形,然后从中生成图标?(How to create vector graphics and then generate icons from them?)
  • 动态Jasper报告列(Dynamic Jasper Report Columns)
  • 如何替换LogoList中的子列表(how to replace sublist in LogoList)
  • 从SQL Server导出到Excel收到错误(Exporting to Excel from SQL Server getting error)
  • 遍历python中的对象(Traversing objects in python)
  • 使用Python消除文件中的冗余(Eliminate redundancies from a file using Python)
  • 用于编译导入的类的命令(Command to compile imported classes)
  • PHP:preg_replace使用反向引用替换缩写(PHP: preg_replace replace abbreviation using backreferences)
  • Gradle Eclipse获取编译问题(Gradle Eclipse getting compile issues)
  • 如何在windows phone 8.1 / Windows 8.1中为http客户端请求操作设置超时(How to set time out for http client request operation in windows phone 8.1/Windows 8.1)
  • 用于从移动应用程序的mysql服务器获取数据的PHP代码[关闭](PHP code to fetch data from mysql server for mobile app [closed])
  • TF30063:您无权访问 - Visual Studio Online(TF30063: You are not authorized to access - Visual Studio Online)
  • 以aspnetBoilerplate中的所有租户的主机管理员身份获取记录(Get records as host admin for all tenants in AspnetBoilerplate)
  • 通过UWSGI / NGINX将参数传递给Python Flask(Pass parameters to Python Flask via UWSGI / NGINX)
  • Vim不会将备份文件保存到正确的目录中(Vim won't save backup files into the correct directory)
  • Intellij无法运行Scala代码(Intellij not able to run Scala Code)
  • opengl的依赖关系(opengl dependencies)
  • 确定具有不同优先级的两个布局约束中的哪一个确定它们影响的维/锚的值(Determining which of two layout constraints with different priorities is determining the value of the dimension/anchor they affect)
  • 在Java中是否可以将对象完全转换为其基类型?(Is it possible in Java to turn an object fully into its base type?)
  • 如果陈述不起作用?(If statements not working?)
  • 如何重定向shell脚本输出从python脚本运行[重复](How to redirect shell script output ran from a python script [duplicate])
  • 重置后尝试访问指针(Trying to access pointer after resetting)
  • Postgres优化插入/读取(Postgres optimize for insert/read only)
  • 360观察者统一,纹理在顶部和底部出现翘曲(360 viewer in unity, texture appears warped in the top and bottom)
  • .net Rx:消息的有序批处理(.net Rx: in-order batch-processing of messages)
  • 查询在给定区域中包含全景图的商业场所的api?(Query places api for business venues in given area which contain panoramas?)
  • iOS7和jQuery mobile:面板在打开和关闭后变为空白(iOS7 and jQuery mobile: panel goes blank once opened and closed)
  • 从Geany内部运行应用程序的多个实例(Run multiple instances of an application from inside Geany)
  • 使用Yii2在邮件中嵌入图像时出错(Error when embed image in mail using Yii2)