Java教程之Spring的Async注解线程池扩展方案

目录

1. 扩展目的

  1. 异步调用,改用Spring提供的@Aysnc注解实现,代替手写线程池执行。
  2. 在实际场景中,可能会遇到需要将主线程的一些个性化参数、变量、数据传递到子线程中使用的需求。
  3. InheritableThreadLocal可以解决子线程继承父线程值的需求,但是它存在一些问题。
    1. SessionUser.SESSION_USER是中台提供,无法修改。
    2. InheritableThreadLocal在线程池机制应用中并不友好,不及时在子线程中清除的话,会造成线程安全问题。

实现思路有两种:

  1. 针对ThreadLocal进行扩展,并说服中台统一改用扩展后的ThreadLocal
  2. 针对@EnableAsync@Async注解进行扩展,将手动copy的代码写入到Spring代理类中。

第一种要跟中台打交道,就很烦,能够天平自己独立解决,就自己解决。第二种会是一个不错的选择,扩展实现也并不困难。

2. 扩展实现

2.1 扩展Async注解的执行拦截器AnnotationAsyncExecutionInterceptor

类全名:org.springframework.scheduling.annotation.AnnotationAsyncExecutionInterceptor

从调试记录可以分析得出AnnotationAsyncExecutionInterceptor#invoke方法,正是创建异步任务并且执行异步任务的核心代码所在,我们要做的就是重写这个方法,将父线程的运行参数手动copy到子线程任务体中。

在这里插入图片描述

2.2 扩展Async注解的Spring代理顾问AsyncAnnotationAdvisor

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值