目录
1. 扩展目的
- 异步调用,改用Spring提供的
@Aysnc
注解实现,代替手写线程池执行。 - 在实际场景中,可能会遇到需要将主线程的一些个性化参数、变量、数据传递到子线程中使用的需求。
InheritableThreadLocal
可以解决子线程继承父线程值的需求,但是它存在一些问题。SessionUser.SESSION_USER
是中台提供,无法修改。InheritableThreadLocal
在线程池机制应用中并不友好,不及时在子线程中清除的话,会造成线程安全问题。
实现思路有两种:
- 针对
ThreadLocal
进行扩展,并说服中台统一改用扩展后的ThreadLocal
。 - 针对
@EnableAsync
和@Async
注解进行扩展,将手动copy的代码写入到Spring代理类中。
第一种要跟中台打交道,就很烦,能够天平自己独立解决,就自己解决。第二种会是一个不错的选择,扩展实现也并不困难。
2. 扩展实现
2.1 扩展Async注解的执行拦截器AnnotationAsyncExecutionInterceptor
类全名:org.springframework.scheduling.annotation.AnnotationAsyncExecutionInterceptor
从调试记录可以分析得出AnnotationAsyncExecutionInterceptor#invoke
方法,正是创建异步任务并且执行异步任务的核心代码所在,我们要做的就是重写这个方法,将父线程的运行参数手动copy到子线程任务体中。