1 场景
客户端调用服务端接口,服务端这个接口比较耗时。为了优化服务端的性能。
服务端收到servlet请求后,释放掉servlet占用的线程资源。
传统的 servlet 请求处理是同步的,即每个请求占用一个线程,直到请求处理完毕。如果处理时间较长,会阻塞线程,导致性能下降。
开启一个异步线程去处理耗时的操作。当耗时操作处理完成后,将结果返回给客户端。
注意:在此期间,客户端和服务端的http链接并不会断开,客户端依旧苦苦等待响应数据;
2 技术选型
可用接口AsyncHandlerInterceptor实现拦截涉及异步处理的请求,注意不是HandlerInterceptor。
HandlerInterceptorAdapter适配器,适配了AsyncHandlerInterceptor和HandlerInterceptor,推荐用其来实现:

void afterConcurrentHandlingStarted(HttpServletRequest request,
HttpServletResponse response,
Object handler)
throws Exception不过在 springboot3.x 中已废除,故本文使用AsyncHandlerInterceptor。
3 实现
3.1 实现异步线程池
释放Servlet线程,交由指定的线程池去处理,咋定义指定线程池?

2.1.2 实现拦截器

2.1.3 Controller代码
方法返回的Callable:
4 流程
4.1 流程图

执行效果:

















