我希望将servlet 3.0的异步支持与spring MVC集成。像这样:
@RequestMapping("/chat")
@WebServlet(name="myServlet", asyncSupported=true)
public String getMessage(String userName) {
......
}
这可行吗?
我希望将servlet 3.0的异步支持与spring MVC集成。像这样:
@RequestMapping("/chat")
@WebServlet(name="myServlet", asyncSupported=true)
public String getMessage(String userName) {
......
}
这可行吗?
不要着急,实现良好的长轮询并不容易。
你提到的方法很有效,但存在严重的“线程饥饿”问题。
每个长轮询将使用一个线程,如果您有1000个并发用户,您需要1000个线程来服务长轮询请求(大多数情况下会在客户端浏览器上更新服务器端状态)。
Jetty 6具有一个连续模式,巧妙地释放长轮询请求的线程,以供真正的应用程序逻辑使用。
在Spring Framework 3.x中尚未实现。请参见https://jira.springframework.org/browse/SPR-5587和https://jira.springsource.org/browse/SPR-8517。
如果您想要的是Comet支持(长轮询Ajax),您可以“尝试”CometD(http://cometd.org/documentation/cometd-java/server/services/integration-spring)。但我要警告您,我已经放弃了它,它太臃肿了! (像长轮询这样简单的事情需要几天的配置?!)
我只会在Spring3中实现一些RESTful控制器并自己编写长轮询程序。向服务器发出Ajax-style请求,您的控制器将保持其打开状态,直到服务器有新数据发送到浏览器。浏览器启动新的长轮询请求以获取后续事件。为了避免连接超时,只需返回使客户端重复请求的虚拟值即可。
通常,最简单的方法是最好的解决方案。
您现在可以使用出色的Atmosphere库来实现此功能:
这是一个Spring MVC示例: https://github.com/ghillert/atmosphere-spring-web-mvc