接收到 request 请求之后,由tomcat 工作线程从 HttpServletRequest 中获得一个异步上下文
AsyncContext 对象,然后由 tomcat 工作线程把 AsyncContext对象传递给业务处理线程,同时tomct工作线程归还到工作线程池,这一步就是异步开始。在业务处理线程中完成业务逻辑的处理,生成response 返回给客户端。在 Servlet3.0 中虽然处里请求可以实现异步,但是InputStream和OutputStream的IO操作还是阻塞的,当数据量大的equest body 或者 response body 的时候,就会导致不必要的等待。
从servlet3.1以后增加了非阻塞10,需要Tomcat8.x支持。
et3的异步使用步骤
1.声明Servlet,增加 asyncSupported属性,开启异步支持。
2.通过request获取异步上下文AsyncContext。
3. 开启业务逻辑处理线程,并将AsyncContext传递给业务线程。
4. 在异步业务逻辑处理线程中,通过asyncContext 获取request和response处理对应的业务。
5. 业务逻辑处理线程处理完成逻辑之后,调用AsyncContext 的 complete 方法。asyncContext.complete();从而结束该次异步线程处理。