《Spring Boot 2.0深度实践之核心技术篇》
DeferredResult自己管理线程
异步应用场景
浏览器向A系统发起请求,该请求需要等到B系统(如MQ)给A推送数据时,A才会立刻向浏览器返回数据;
如果指定时间内B未给A推送数据,则返回超时。
DeferredResult
Tomcat等应用服务器的连接线程池实际上是有限制的;每一个连接请求都会耗掉线程池的一个连接数;如果某些耗时很长的操作,如对大量数据的查询操作、调用外部系统提供的服务以及一些IO密集型操作等,会占用连接很长时间,这个时候这个连接就无法被释放而被其它请求重用。如果连接占用过多,服务器就很可能无法及时响应每个请求;极端情况下如果将线程池中的所有连接耗尽,服务器将长时间无法向外提供服务!
【小家Spring】高性能关键技术之—-体验Spring MVC的异步模式(Callable、WebAsyncTask、DeferredResult) 基础使用篇 - 云+社区 - 腾讯云
DeferredResult原理
DeferredResultMethodReturnValueHandler
异步调用的filter和interceptor
- filter可以正常使用
- interceptor的pre会调用两次
AsyncHandlerInterceptor
异步所产生的三个问题:filter、ThreadLocal、Exception
- 所有filter要设置async-supported=true
- threadlocal改用参数或RequestAttribute传递
补足异步异常处理逻辑(参见相关笔记)。
- Spring异步未处理异常处理程序? - 问答 - 云+社区 - 腾讯云
异步可以使用InheritableThreadLocal
- Spring异步未处理异常处理程序? - 问答 - 云+社区 - 腾讯云
Spring @Async annotation and ThreadLocal – yoavbenishai
inheritableThreadLocal 原理
就是在new thread的时候将原来线程中的threadlocal复制过来。
Java 多线程:InheritableThreadLocal 实现原理 - ni357103403的博客 - CSDN博客
线程池怎么使用inheritableThreadLocal?
TransmittableThreadLocal 解决 线程池线程复用 无法复制 InheritableThreadLocal 的问题. - 181282945 - 博客园
Spring Cloud中Hystrix 线程隔离导致ThreadLocal数据丢失
怎么在@Async中使用transmittable-thread-local
通过AsyncConfigurer 配置线程池