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
方法是非阻塞的,所以其下一行代码仍将执行
,即使还未调度线程启动。
原文链接: 11.2 编写异步Servlet和过滤器