1、什么是servlet异步请求
Servlet 3.0 之前,一个普通 Servlet 的主要工作流程大致如下:
(1)、Servlet 接收到请求之后,可能需要对请求携带的数据进行一些预处理;
(2)、调用业务接口的某些方法,以完成业务处理;
(3)、根据处理的结果提交响应,Servlet 线程结束。
其中第二步处理业务逻辑时候很可以碰到比较耗时的任务,此时servlet主线程会阻塞等待完成业务处理,对于并发比较大的请求可能会产生性能瓶颈,则servlet3.0之后再此处做了调整,引入了异步的概念。
(1)、Servlet 接收到请求之后,可能需要对请求携带的数据进行一些预处理;
(2)、调用业务接口的某些方法过程中request.startAsync()请求,获取一个AsyncContext
(3)、紧接着servlet线程退出(回收到线程池),但是响应response对象仍旧保持打开状态,新增线程会使用AsyncContext处理并响应结果。
(4)、AsyncContext处理完成触发某些监听通知结果
2、Servlet异步请求示例
2.1、示例准备
本示例采用web.xml配置的形式,模拟场景为:笔者所在的it公司每周的工作内容,首先研发总监分配给产品、研发、测试相关的任务,布置完任务就出差(模拟请求响应),余下的各个小组进行自己任务操作(模拟的耗时操作),最终出周报完成任务(异步任务处理完成的通知)
git地址:https://github.com/liushangzaibeijing/spsm.git 分支:dev_async