当前位置: 首页 > news >正文

Spring Async异步源码分析

可以在项目中设置多个线程池,在异步调用时,指明需要调用的线程池名称。
==> 单纯的@Async注解,无法满足线程编排的功能。
疑问
1、注解+http页面请求,和注解+定时任务请求的区别?
注解+http请求,没有自定义线程池,会有一个默认的线程池,但是没有找到具体的类。
@Async新增的线程,会重新create new SqlSession,线程也没有绑定的HttpServletRequest()【利用自定义线程池,添加TaskDecorator,在decorate()里面进行RequestContextHolder进行get、set、reset】
2、注解,多个任务并行,主线程是否会等待子线程执行完毕?
如果异步方法没有返回Futrue,主线程没有get,那么主线程会继续向下执行。
3、注解与事务的处理?
Spring事务与线程绑定,需要手动传递事务。
4、自定义线程池和spring提供的线程池有什么区别?
Spring获取线程池的代码在org.springframework.aop.interceptor.AsyncExecutionAspectSupport类中determineAsyncExecutor()中,getDefaultExecutor()是用来获取默认的线程池。但是代码去获取时,getBean(TaskExecutor.class)得到的是ThreadPoolTaskExecutor实例。这里不是默认的SimpleAsyncTaskExecutor实例。
5、@Async+@EventListener的使用?
@EventListener是同步的。两者同时使用可以保证异步。
6、异步任务的返回值的处理?
异步方法,返回Future类型即可。
7、源码分析?
org.springframework.aop.intercepor.AsyncExecutionInterceptor.invoke()。
线程池使用特点:
1、并行处理任务
2、线程可重用
3、任务可等待
4、自动扩容、自动限流
5、不会出现资源耗尽,或者OOM异常。
6、事务处理、异常处理

Spring @Async的原理
Spring版本:5.3.39
Async位于Spring-context包的org.springframework.scheduling.annotation,基于AOP来实现。
● 目标方法签名而言,任何参数类型都是支持的。不过,返回类型被限制为 void 或 Future。
● 从代理返回的 Future 句柄将是一个实际的异步 Future,可用于跟踪异步方法执行的结果。但是,由于目标方法需要实现相同的签名,它必须返回一个临时的 Future 句柄,这个句柄仅传递一个值:例如 Spring 的 AsyncResult、EJB 3.1 的 AsyncResult 或 CompletableFuture.completedFuture(Object)。
org.springframework.scheduling.annotation包下代码分析: 有两个功能,一个是Async,一个是scheduling。本例只研究Async功能。
代码逻辑:
执行顺序:
启动类添加@EnableAsync注解,@Import注解导入AsyncConfigurationSelector配置。 AsyncConfigurationSelector 通过配置判断是否引入基于接口的ProxyAsyncConfiguration。
一、带有@Configuration注解的配置类

  1. ProxyAsyncConfiguration
    执行父类:AbstractAsyncConfiguration:
    @Autowired标注的setConfigurers()方法: 获取线程池和异常处理handler
    @Override标注的setImportMetadata()方法
    执行子类:
    asyncAdvisor()方法
    二、继承了AbstractBeanFactoryAwareAdvisingPostProcessor的类.
    1.AsyncAnnotationBeanPostProcessor: @Override setBeanFactory()方法;
    1 AsyncAnnotationBeanPostProcessor: @Override setBeanFactory()
    1.1 new AsyncAnnotationAdvistor(this.executor, this.exceptionHandler).
    1.1.1 buildAdvice();
    AnnotationAsyncExecutionInterceptor interceptor = new AnnotationAsyncExecutionInterceptor(null);
    1.1.2 buildPointcut();

注解:
● Async
● EnableAsync
这个注解的参数,有点复杂。默认代理模式,JDK。默认带有@Async注解的方法进行异步处理。
接口:
● AsyncConfigurer:用于定制自定义线程池。
子类实现接口,需要添加 @Configuration ,启动类添加 @EnableAsync 。
类:
● AbstractAsyncConfiguration
异步配置抽象类,提供了基础的代码结构。
● AnnotationAsyncExecutionInterceptor
异步执行注解切面. 继承了org.springframework.aop.interceptor的AsyncExecutionInterceptor类,编排逻辑在invoke()里面。
AsyncExecutionInterceptor 的一个特化版本.
一个专门处理异步方法调用的拦截器,该拦截器根据 @Async 注解中的配置选择合适的 Executor 来执行方法
● AsyncAnnotationAdvisor
用于识别和处理被 @Async 注解标记的方法。

  1. 识别带有 @Async 注解的方法:AsyncAnnotationAdvisor 会查找所有使用了 @Async 注解的方法,并将这些方法作为切入点(pointcut),从而决定哪些方法应该以异步方式执行。
  2. 提供通知逻辑:一旦确定了需要异步执行的方法,AsyncAnnotationAdvisor 就会在这些方法调用时应用特定的通知逻辑。这通常意味着该方法会被提交给一个任务执行器(TaskExecutor)来异步运行,而不是直接由当前线程执行。
  3. 集成到 AOP 中:作为 Spring AOP 的一部分,AsyncAnnotationAdvisor 可以无缝地与 Spring 的其他组件集成,比如事务管理、安全控制等,使得开发者可以在不影响业务逻辑的情况下轻松添加异步行为。
    ● AsyncAnnotationBeanPostProcessor
    Spring启动初始化后置处理,把含有注解的代码生成切面代理。
    Bean 后处理器,它会自动为任何在类级别或方法级别带有 @Async 注解的 Bean 应用异步调用行为,通过向暴露的代理(无论是现有的 AOP 代理还是新生成的实现目标所有接口的代理)添加相应的 AsyncAnnotationAdvisor 来实现。 负责异步执行的任务执行器(TaskExecutor)可以被提供,同时也可以指定指示方法应该异步调用的注解类型。
    ● AsyncConfigurationSelector
    异步配置选择器。 根据导入 @Configuration 类上的 EnableAsync.mode() 的值来选择应使用哪个 AbstractAsyncConfiguration 的实现。 @Async注解传入
    ● AsyncConfigurerSupport
    异步配置支持,默认的。
    ● AsyncResult
    异步返回结果
    ● ProxyAsyncConfiguration
    代理异步配置。
    带有 @Configuration 注解的类,它注册了启用基于代理的异步方法执行所必需的 Spring 基础设施 Bean。
    这句话描述了一个配置类的作用,该类通过定义和注册必要的 Spring Bean 来支持异步方法的执行。这些 Bean 通常包括任务执行器(如 TaskExecutor)和其他相关的基础设施组件,它们使得用 @Async 注解标记的方法能够以异步方式运行。

额外知识点:
1、Nullable、NonNullApi 和 NonNullFields 是 Java 中用来帮助开发者明确地指定哪些变量可以为 null,哪些不能为 null 的注解。
2、hierarchy [ˈhaɪərɑːki] 层次体系、 determine 确定|决定
3、Spring不类型的组件后缀,以及代表的意思。 Executor Qualifier


http://www.mrgr.cn/news/55485.html

相关文章:

  • LED计数电路综合实验
  • Scrapy | 使用Scrapy进行数据建模和请求
  • linux file结构体与inode结构体
  • AI大模型是否有助于攻克重大疾病?
  • Linux:线程及其控制
  • 机器学习核心:监督学习与无监督学习
  • 文件 (上)
  • 兴业周报|央行宣布“有力度的降息”他来了
  • GPT+Python)近红外光谱数据分析与定性/定量建模技巧
  • 副业跨境电商卖穿戴甲,新手一个月赚这么多...
  • 在linux中 appimage是什么文件? 为什么能直接运行
  • 扩散模型对抗蒸馏:ADD 和 Latent-ADD
  • 每日一道算法题(Leetcode 20)
  • java如何部署web后端服务
  • InnoDB引擎(架构,事务原理,MVCC详细解读)
  • Python多进程学习与使用:全面指南
  • 杨笠代言风波:京东股价逆流而上?
  • wordcloud分词生成
  • 31.第二阶段x86游戏实战2-遍历技能2(技能二叉树基址)
  • 第 6 章 Kafka-Eagle 监控 和 Kafka-Kraft 模式
  • 电能表预付费系统-标准传输规范(STS)(16)
  • 2025 年IT技术人员关键技能,零基础入门到精通,收藏这篇就够了
  • C++ : STL容器之list剖析
  • 业务开发常见问题-并发工具类
  • Bootstrap Blazor框架添加全局页面水印
  • OpenIPC开源IPC之Ardupilot配置