在spring 3.2 及以后版本中增加了对请求的异步处理,旨在提高请求的处理速度降低服务性能消耗。
在我们的请求中做了耗时处理,当并发请求的情况下,为了避免web server的连接池被长期占用而引起性能问题,调用后生成一个非web的服务线程来处理,增加web服务器的吞吐量。
为此 Servlet 3.0 新增了请求的异步处理,Spring 也在此基础上做了封装处理。
本文还是以代码例子的方式说明如何在 Spring Boot 中应用异步请求。
首先说一下几个要点:
1、@WebFilter 和 @WebServlet 注解中的 asyncSupported = true 属性
异步处理的servlet若存在过滤器,则过滤器的注解@WebFilter应设置asyncSupported=true,
否则会报错 A filter or servlet of the current chain does not support asynchronous operations.
2、@EnableAsync 注解
Spring Boot 默认添加了一些拦截 /* 的过滤器,因为 /* 会拦截所有请求,按理说我们也要设置 asyncSupported=true 属性。因为这些过滤器都是 Spring Boot 初始化的,所以它提供了 @EnableAsync 注解来统一配置,该注解只针对 “非 @WebFilter 和 @WebServlet 注解的有效”,所以我们自己定义的 Filter 还是需要自己配置 asyncSupported=true 的。
3、AsyncContext 对象
获取一个异步请求的上下文对象。