我想将servlet 3.0异步支持与spring MVC集成。类似的东西:
@RequestMapping("/chat")
@WebServlet(name="myServlet", asyncSupported=true)
public String getMessage(String userName) {
......
}
有可能吗?
答案 0 :(得分:4)
不是那么快,实施良好的长轮询并不容易。 你提到的方法运作良好,但存在严重的“线程饥饿”问题
每个Long轮询将耗尽一个线程,如果您有1000个并发用户,则需要1000个线程来为长轮询请求提供服务(大多数情况下会在客户端浏览器上更新服务器端状态)
Jetty 6有一个继续模式,可以巧妙地释放长轮询请求的线程,以供真正的应用程序逻辑使用。
答案 1 :(得分:3)
尚未在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样式的请求,控制器会保持打开状态,直到服务器有新数据发送到浏览器。浏览器启动新的长轮询请求以获取后续事件。为了避免连接超时,只需返回使客户端重复请求的虚拟值。
简单易行是大多数时候最好的解决方案。
答案 2 :(得分:2)
这个问题已经很老了,但仍然没有答案。作者希望在Spring MVC中提供异步支持,但仍然没有给出解决方案。
如前所述,异步支持请求已提交给spring社区bugtracker,并将在Spring 3.1.0中实现。这是最近发布的,但根据发布说明,计划在3.2.0版本中进行“Servlet 3.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太大,太慢,太难开发。
答案 3 :(得分:1)
您现在可以使用精彩的Atmosphere库进行此类操作:
这是一个Spring MVC示例: https://github.com/ghillert/atmosphere-spring-web-mvc
答案 4 :(得分:0)
目前正在考虑Servlet 3.0异步支持。如果您希望反映特定情况,请在SPR-8517下发表评论,或观看故障单并按照讨论进行操作。
答案 5 :(得分:0)
是的,您现在可以使用。您需要添加ApplicationInitializer类,该类扩展了 AbstractAnnotationConfigDispatcherServletInitializer 类。
package co.tellmehow.config
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
public class ApplicationInitializer extends
AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses () {
return null;
}
@Override
protected Class<?>[] getServletConfigClasses () {
return new Class<?>[]{ApplicationWebConfig.class};
}
@Override
protected String[] getServletMappings () {
return new String[]{"/"};
}
}
我们必须扩展AbstractAnnotationConfigDispatcherServletInitializer类,该类在不需要应用程序上下文层次结构时使用,应用程序可以通过 getRootConfigClasses()返回所有配置,并从 getServletConfigClasses()返回null。 strong>。
现在,您可以在Spring Application中使用@WebServlet批注。
Full source code with explanation present here.
@WebServlet(name = "myServlet", urlPatterns = "/myServlet")
public class MyServlet extends HttpServlet {
private static final long serialVersionUID = 7088410241741084414L;
@Override
protected void doGet (HttpServletRequest req,
HttpServletResponse resp)
throws ServletException, IOException {
System.out.println("-- In MyServlet --");
PrintWriter writer = resp.getWriter();
writer.println("Tell Me How: MyServlet running now");
}
}