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

Posted

技术标签:

【中文标题】如何在 Spring MVC 3 中使用 Servlet 3 @WebServlet 和异步?【英文标题】:How to use Servlet 3 @WebServlet & async with Spring MVC 3? 【发布时间】:2011-03-21 16:37:28 【问题描述】:

我想将 servlet 3.0 异步支持与 spring MVC 集成。比如:

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

有可能吗?

【问题讨论】:

【参考方案1】:

您现在可以使用出色的 Atmosphere 库来做到这一点:

这是一个 Spring MVC 示例: https://github.com/ghillert/atmosphere-spring-web-mvc

【讨论】:

【参考方案2】:

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

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

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

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

【讨论】:

应该为发布的 Spring 3.1.0 实现,但根据jira.springsource.org/browse/SEC-1685 它已移至 3.2.0... 然而,Servlet 3.0 支持是广义的,并不一定意味着异步处理也将实现【参考方案3】:

目前正在考虑 Servlet 3.0 异步支持。如果您有具体的场景希望看到反映,请在SPR-8517 下评论或观看票并关注讨论。

【讨论】:

【参考方案4】:

这个问题很老了,但仍然没有答案。作者想在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 bean 以允许与应用程序的其余部分进行通信。我遇到了一些问题,在我的问题中有所描述: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 太大、太慢、太难开发。

【讨论】:

【参考方案5】:

没那么快,实现好的长轮询也不是那么容易。 您提到的方法效果很好,但是存在严重的“线程饥饿”问题

每个长轮询将使用一个线程,如果您有 1000 个并发用户,则需要 1000 个线程来服务长轮询请求(大部分时间会在客户端浏览器上更新服务器端状态)

Jetty 6 有一个 continue 模式,它巧妙地释放长轮询请求的线程以供实际应用程序逻辑使用。

【讨论】:

还有 Jetty 7,现在 2011 年中的当前版本完全支持这一点。我也在寻找弹簧支持的当前状态。

以上是关于如何在 Spring MVC 3 中使用 Servlet 3 @WebServlet 和异步?的主要内容,如果未能解决你的问题,请参考以下文章

Spring mvc 3:如何在拦截器中获取路径变量?

如何在 Spring 3 MVC 应用程序中对文件上传进行病毒扫描[关闭]

是啥导致此 Spring MVC 应用程序中的映射失败?

如何使用 spring 3.2 新 mvc 测试登录用户

如何在 Spring MVC 3 中实现分页 [关闭]

Spring 3 MVC 从控制器访问全局变量