如何在Spring MVC 3中使用Servlet 3的@WebServlet和异步特性?

12

我希望将servlet 3.0的异步支持与spring MVC集成。像这样:

@RequestMapping("/chat")
@WebServlet(name="myServlet", asyncSupported=true)
public String getMessage(String userName) {
      ......
}

这可行吗?

5个回答

4

不要着急,实现良好的长轮询并不容易。

你提到的方法很有效,但存在严重的“线程饥饿”问题。

每个长轮询将使用一个线程,如果您有1000个并发用户,您需要1000个线程来服务长轮询请求(大多数情况下会在客户端浏览器上更新服务器端状态)。

Jetty 6具有一个连续模式,巧妙地释放长轮询请求的线程,以供真正的应用程序逻辑使用。


Jetty 7,现在是2011年中完全支持此功能的当前版本。我也在寻找Spring支持的最新状态。 - David Parks

3

在Spring Framework 3.x中尚未实现。请参见https://jira.springframework.org/browse/SPR-5587https://jira.springsource.org/browse/SPR-8517

如果您想要的是Comet支持(长轮询Ajax),您可以“尝试”CometD(http://cometd.org/documentation/cometd-java/server/services/integration-spring)。但我要警告您,我已经放弃了它,它太臃肿了! (像长轮询这样简单的事情需要几天的配置?!)

我只会在Spring3中实现一些RESTful控制器并自己编写长轮询程序。向服务器发出Ajax-style请求,您的控制器将保持其打开状态,直到服务器有新数据发送到浏览器。浏览器启动新的长轮询请求以获取后续事件。为了避免连接超时,只需返回使客户端重复请求的虚拟值即可。

通常,最简单的方法是最好的解决方案。


应该在发布的Spring 3.1.0中实现,但根据https://jira.springsource.org/browse/SEC-1685,它被移动到了3.2.0...然而,Servlet 3.0支持是一个广泛的术语,不一定意味着异步处理也会被实现。 - Danubian Sailor

2
这段文字的意思是:“这个问题很久了,但仍然没有答案。作者想在Spring MVC中获得异步支持,但解决方案仍未给出。正如之前的回答所述,异步支持请求已提交到Spring社区bugtracker,并计划在Spring 3.1.0中实现。最近已经发布了这个版本,但根据发布说明,“Servlet 3.0支持”计划在版本3.2.0中完成:https://jira.springsource.org/browse/SEC-1685。”
我需要一个高效的COMET应用程序。我的当前实现基于这个例子:http://code.google.com/p/jquery-stream/wiki/EchoExample,但我想将其移到Spring MVC控制器中。目前,我已经改进了这个例子,并手动注入了Spring beans以允许与应用程序的其余部分通信。我在这方面遇到了一些问题,在我的问题描述中有所说明:Tomcat 7 Async Processing failing - only one request processed simultanously。目前它运行良好。
我找到了一个使用jboss解决方案的例子:http://docs.jboss.org/resteasy/docs/1.0.0.GA/userguide/html/Asynchronous_HTTP_Request_Processing.html,但对我来说使用jboss不是一个解决方案。JBoss太大、太慢、太难开发。

1

0

目前正在考虑Servlet 3.0异步支持。如果您有特定的场景希望得到反映,请在SPR-8517下发表评论或关注该票并参与讨论。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接