11.2 编写异步Servlet和过滤器
11.2 编写异步Servlet和过滤器
新的WebServlet和WebFilter注解中包含了asyncSupport属性。要编写支持异步处理的Servlet或过滤器,需设置asyncSupported属性为true:
1 |
此外,也可以在部署文件里面指定这个描述符。例如,下面的 Servlet 配置为支持异步处理:
1 | <servlet> |
Servlet或过滤器要支持异步处理,可以通过调用ServletRequest的startAsync方法来启动一个新线程。这里有两个startAsync的重载方法:
1 | //无参方法 |
这两个重载方法都返回一个AsyncContext的实例,这个实例提供各种方法并且包含ServletRequest实例和ServletResponse实例。
- 第一个重载实例比较简单并且使用方便。由此生成的
AsyncContext实例将包含原生的ServletRequest实例和ServletResponse实例。 - 第二个允许您将原来的
ServletRequest和ServletResponse进行重写封装后传给AsyncContext。
需要注意的是,你只能传递原生的ServletRequest和ServletResponse或它们的封装(装饰)到startAsync第二种重载实例。我们已在第10章“修饰Requests和Responses”中讨论过ServletRequest和ServletResponse的封装(装饰)。
注意,startAsync重复调用将返回相同的AsyncContext实例。若一个Servlet或过滤器调用startAsync时不支持异步处理,将抛出java.lang.illegalstateexception异常。还请注意,**AsyncContext的start方法是非阻塞的,所以其下一行代码仍将执行**,即使还未调度线程启动。