Servlet 3.0 asyncSupported
1. 阻塞与并发
Servlet 3.0之前的请求访问模型都是阻塞式的,一个请求未处理完就不能进行下一个请求,请求之间是排队进行的:
[图-阻塞式请求-响应模型]
一个典型的阻塞式Servlet如下:
package cc11001100.servlet.study; import java.io.IOException; import java.util.concurrent.TimeUnit; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet(urlPatterns={"/foo"}) public class FooServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { try { System.out.println(Thread.currentThread()+" : "+System.currentTimeMillis()); /*这里模拟调用了其它的服务,耗费了巨量的时间*/ TimeUnit.SECONDS.sleep(10); System.out.println(Thread.currentThread()+" : "+System.currentTimeMillis()); } catch (InterruptedException e) { e.printStackTrace(); } resp.getWriter().write("Response success done!"); } }
我们同时打开两个网页进行观察,可以看到第一个请求未处理完的时候第二个一直处在等待状态:
[图-阻塞住了]
如果当并发量很大的时候这肯定要gg的,同一时间只能处理一个请求是硬伤...Servlet 3.0为我们提供了异步处理的方法,在配置Servlet的时候有一个asyncSupported选项,当此选项配置为true的时候可以使用一个AsyncContext对象来将原线程返回