首页 \ 问答 \ 使用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

相关问答

更多

在C中使用sqrt时出错(Error when using sqrt in C)

对于所有最新版本的GCC,编译时必须显式链接到数学库,因为它不会自动链接到标准C库的其余部分)。 如果使用gcc或g ++命令在命令行上进行编译,则可以通过在命令末尾加上-lm来实现。 例如:gcc -o foo foo.c -lm 或者你可以在Makefile中添加标志,你正在使用它进行编译 With all recent versions of GCC, you have to explicitly link to the math library when compiling, since

将行转换为列oracle SQL(Convert rows to columns oracle SQL)

您可以使用row_number()并生成pivot : SQLFiddle演示 select * from ( select d.*, row_number() over(partition by type order by id) rn from data d) pivot (max(type) type, max(id) id for type in ('test1' t1, 'test2' t2)) You could enumerate rows with row_n

Ajax请求只在Safari中发生空白响应(Ajax request blank response only happening in Safari)

https://api.bitcoinaverage.com/ticker/EUR正在回复重定向到https://api.bitcoinaverage.com/ticker/EUR/ (请注意尾随斜杠)。 我不太清楚Safari的问题到底是什么,但它在重定向时似乎丢失了CORS头。 如果你使用尾部斜杠发出请求它可以正常工作: http : //jsfiddle.net/8XR3u/2/ https://api.bitcoinaverage.com/ticker/EUR is responding

使用R中第二个函数内的一个函数的变量值(using the value of a variable from one function within a second function in R)

您需要在调用randFunc使用一个字符串,因为您放入的参数不存在。 然后,在函数内部,您可以使用eval(parse(text = "something"))将其用作theta函数的非字符串输入。 randFunc<-function(parameter,value){ s<-theta(eval(parse(text = parameter)) = value) return(s) } 然后用它来调用它 randFunc("e", 0.1) @Cath提供了一个不使用eval(p

为什么Django AssertFormError抛出一个TypeError:类型为'property'的参数是不可迭代的?(Why does Django AssertFormError throw a TypeError: argument of type 'property' is not iterable?)

发生这种情况是因为您在视图中将form上下文变量设置为form 类本身,而不是该类的实例 。 更换: context_dict['form'] = ResetSessID 有: context_dict['form'] = form 其中form是您在form.is_valid()检查上form.is_valid()的变量。 如果你的form.is_valid()阻止,请在两个分支中执行此操作。 外部if块同样如此: # Not a post request context_dict = {'f

在UISearchBar搜索按钮单击上更改UITableView数据源(Change UITableView data source on UISearchBar search button click)

您需要在searchBar委托上管理标志。 SearchBar委托 - (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar{ searchBar.text = @""; isSearch = NO ; [arrFilter removeAllObjects]; [searchTblView reloadData]; [searchBar resignFirstResponder]; }

如何缩小angular.js?(How to minify angular.js?)

使用CDN来传递像angular或jquery这样的常用库,你可以避免自己构建它时可能遇到的麻烦。 如果您没有具体的理由和优势,那么CDN是一个很好的方法。 一些主要的图书馆在谷歌提供的非常可靠的服务器上免费托管在CDN上: https://developers.google.com/speed/libraries/ 您只需将代码库包含在代码中即可: <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.7/angula

使用不同数量的参数重新定义多态中的函数(虚拟)(Redefined function ( virtual ) in polymorphism with different number of arguments)

如果您确实想要重写该方法,则它必须具有相同的签名,其中包含参数。 这意味着,在这种情况下会有2个参数。 是的,默认参数是有效的,但是如果你有Particles *,那么它就不会帮助你,就像@molbdnilo提到的那样。 如果你愿意,你可以在方法的主体中检查,参数值是0。 否则,您可以创建一个具有不同签名的新方法,即具有1个参数,但您只能在Photons *中使用它。 无论如何,这取决于你将要使用这些类的方式。 If you really want to override the method,

相关文章

更多

最新问答

更多
  • asp.net任意用户信息(asp.net arbitrary user info)
  • 如何使用python计算docx文件中表中行的值(How to count the row's values in tables in docx file by using python)
  • MySQL:用户访问和数据库覆盖(MySQL: User access and DB overwriting)
  • 还有另一种“使用未分配的局部变量”的问题(Yet Another “Use of unassigned local variable 'whatever' ” question)
  • 开源证书颁发机构软件(Open source certificate authority software)
  • Rails中的迭代form_for是在create上添加模型的所有实例(Iteration in Rails form_for is adding all instances of model on create)
  • 如何扩展我的表视图单元格?(How to expand my table view cell?)
  • 如何使用SPARQL区分Thing和无生命对象(How to differentiate between a Thing and an inanimate object with SPARQL)
  • 在IdentityServer中,Client Secrets和Scope Secrets有什么区别?(In IdentityServer, what is the difference between Client Secrets and Scope Secrets?)
  • 如何在具有附加类时重写类(How do I override a class when it has a attached class)
  • 如何使用Git在Azure上部署C#,MVC4应用程序(How to deploy a C#, MVC4 application on Azure using Git)
  • Sitecore 7内容搜索爬网程序根目录之外的索引项(Sitecore 7 Content Search indexing items outside of crawler root)
  • 我应该在线课程使用utf-8编码吗?(Should I use utf-8 encoding for an online course?)
  • 如何在Cucumber-JS步骤定义中使用Node-mysql连接到MySQL?(How to connect to MySQL using Node-mysql in a Cucumber-JS step definition?)
  • 在MVC 4中的google.maps.LatLng(lat,lon)中将JSON字符串值分配给纬度和经度(Assign the JSON string value to Latitude and Longitude in google.maps.LatLng(lat,lon) in MVC 4)
  • awk:通过特定的分隔符删除字符串(awk: remove strings by specific delimiter)
  • 如何测试Vista的应用程序(How to test app for Vista)
  • Elasticsearch聚合器 - 缺失值的工作原理(Elasticsearch aggregators - How missing values work)
  • 绘制datetime.date熊猫(Plot datetime.date pandas)
  • PostgreSQL作为WSO2 EI和APIM + IS的数据源(PostgreSQL as datasource for WSO2 EI and APIM+IS)
  • 如何使用bash在postgres中运行alter table脚本(How to run alter table script in postgres using bash)
  • 可能使用PHP阻止整个美国州访问我的网站?(Might it be possible to block an entire US state from accessing my site, using PHP?)
  • restangular删除并输入错误网:: ERR_NAME_NOT_RESOLVED(restangular remove and put error net::ERR_NAME_NOT_RESOLVED)
  • 常见问题解答的Modx(Revolution)搜索功能(Modx(Revolution) search function for FAQs)
  • Rubymine如何使用远程口译员和Git?(How Does Rubymine Work With Remote Interpreters and Git?)
  • prepareForSegue和PerformSegueWithIdentifier发件人(prepareForSegue and PerformSegueWithIdentifier sender)
  • postgrsql与PowerShell无提示安装问题(postgresql silent installation issue with powershell)
  • 比较两个greps的输出(Comparing output from two greps)
  • 使用.NET RIA Data Services删除Silverlight 3中的数据(Deleting data in Silverlight 3 with .NET RIA Data Services)
  • 此行中AND运算符的含义(meaning of the AND operator in this line)