11.2 编写异步Servlet和过滤器

11.2 编写异步Servlet和过滤器

新的WebServletWebFilter注解中包含了asyncSupport属性。要编写支持异步处理的Servlet或过滤器,需设置asyncSupported属性为true

1
2
3
4
5
6
7
8
@WebServlet(
asyncSupported=true
...
)
@WebFilter(
asyncSupported=true
...
)

此外,也可以在部署文件里面指定这个描述符。例如,下面的 Servlet 配置为支持异步处理:

1
2
3
4
5
<servlet>
<servlet-name>AsyncServlet</servlet-name>
<servlet-class>servlet.MyAsyncServlet</servlet-class>
<async-supported>true</async-supported>
</servlet>

Servlet过滤器要支持异步处理,可以通过调用ServletRequeststartAsync方法来启动一个新线程。这里有两个startAsync的重载方法:

1
2
3
4
5
6
7
//无参方法
AsyncContext startAsync()
throws java.lang.IllegalStateException
//带参方法
AsyncContext startAsync(ServletRequest servletRequest,
ServletResponse servletResponse)
throws java.lang.IllegalStateException

这两个重载方法都返回一个AsyncContext的实例,这个实例提供各种方法并且包含ServletRequest实例和ServletResponse实例。

  • 第一个重载实例比较简单并且使用方便。由此生成的AsyncContext实例将包含原生的ServletRequest实例和ServletResponse实例。
  • 第二个允许您将原来的ServletRequestServletResponse进行重写封装后传给AsyncContext

需要注意的是,你只能传递原生的ServletRequestServletResponse或它们的封装(装饰)到startAsync第二种重载实例。我们已在第10章“修饰RequestsResponses”中讨论过ServletRequestServletResponse的封装(装饰)。
注意,startAsync重复调用将返回相同的AsyncContext实例。若一个Servlet或过滤器调用startAsync时不支持异步处理,将抛出java.lang.illegalstateexception异常。还请注意,**AsyncContextstart方法是非阻塞的,所以其下一行代码仍将执行**,即使还未调度线程启动。