Spring异步任务@Async的默认线程池执行器是如何初始化的

Spring异步任务@Async的默认线程池执行器,是从哪里来?是如何初始化的?

结论先行

异步任务@Async的默认线程池执行器是通过TaskExecutionAutoConfiguration#applicationTaskExecutor自动注入的。

异步任务的线程池执行器是如何初始化的?

从异步调用拦截器作为切入点,看看异步调用拦截器的调用流程是咋样的?

AsyncExecutionInterceptor#invoke

org.springframework.aop.interceptor.AsyncExecutionInterceptor

异步任务的执行调用入口
AsyncExecutionInterceptor#invoke —> AsyncExecutionAspectSupport#determineAsyncExecutor
AsyncExecutionInterceptor.invoke()

AsyncExecutionAspectSupport#determineAsyncExecutor

AsyncExecutionAspectSupport#determineAsyncExecutor —> 先调用getExecutorQualifier(method),再调用this.defaultExecutor.get()
AsyncExecutionAspectSupport.determineAsyncExecutor()

AnnotationAsyncExecutionInterceptor#getExecutorQualifier

getExecutorQualifier方法在AnnotationAsyncExecutionInterceptor#getExecutorQualifier被覆盖重写
AnnotationAsyncExecutionInterceptor.getExecutorQualifier()
AnnotatedElementUtils.findMergedAnnotation(method, Async.class)会返回@Async注解实例。
AnnotatedElementUtils.findMergedAnnotation(method, Async.class)是如何查找@Async注解?会起另一篇文章说明。

defaultExecutor是如何初始化的?

接下来,看看defaultExecutor是如何初始化的?
defaultExecutor初始化 —> getDefaultExecutor(this.beanFactory)
AsyncExecutionAspectSupport()

AsyncExecutionAspectSupport#getDefaultExecutor

AsyncExecutionAspectSupport#getDefaultExecutor —> 先调用beanFactory.getBean(TaskExecutor.class),再调用beanFactory.getBean(DEFAULT_TASK_EXECUTOR_BEAN_NAME, Executor.class)
AsyncExecutionAspectSupport.getDefaultExecutor()
AsyncExecutionInterceptor#getDefaultExecutor覆盖重写了本方法
debug调试发现super.getDefaultExecutor(beanFactory)已返回默认的执行器实例,说明是从beanFactory里获取的。
【猜想】可能是在哪个AutoConfiguration里自动注入的?
AsyncExecutionInterceptor.getDefaultExecutor()
查看beanFactory里注入的bean实例列表,发现如下线索。
TaskExecutionAutoConfiguration

applicationTaskExecutor -> {BeanDefinitionHolder@17669} "Bean definition with name 'applicationTaskExecutor' and aliases [taskExecutor]: Root bean: class [null]; scope=singleton; abstract=false; lazyInit=true; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=org.springframework.boot.autoconfigure.task.TaskExecutionAutoConfiguration; factoryMethodName=applicationTaskExecutor; initMethodName=null; destroyMethodName=(inferred); defined in class path resource [org/springframework/boot/autoconfigure/task/TaskExecutionAutoConfiguration.class]"

DefaultExecutor是否从TaskExecutionAutoConfiguration实例化而来

实例内存地址id是否一样?

TaskExecutionAutoConfiguration#applicationTaskExecutor

org.springframework.boot.autoconfigure.task.TaskExecutionAutoConfiguration

通过debug验证猜想,根据实例内存地址id,就是这里生成的。
TaskExecutionAutoConfiguration#taskExecutorBuilder
TaskExecutionAutoConfiguration.taskExecutorBuilder()
TaskExecutionAutoConfiguration#applicationTaskExecutor
TaskExecutionAutoConfiguration.applicationTaskExecutor()
实例内存地址id都是ThreadPoolTaskExecutor@11620
org.springframework.beans.factory.support.SimpleInstantiationStrategy#instantiate
SimpleInstantiationStrategy.instantiate()

AsyncExecutionInterceptor#getDefaultExecutor

org.springframework.aop.interceptor.AsyncExecutionInterceptor#getDefaultExecutor
AsyncExecutionInterceptor.getDefaultExecutor()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/21539.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

NextJS延迟加载字体

在定义 font-face 的 CSS 中,如果浏览器解析到该规则,它会立即尝试加载指定的字体文件,而不等待 JavaScript 的执行。这意味着在没有调用 JavaScript(如 Font Face Observer)之前,浏览器会自动加载 font-fa…

Python攻防入门:揭秘安全与风险之舞

Python攻防入门:揭秘安全与风险之舞 Python,作为一门广泛应用的编程语言,既被无数开发者用于构建各类应用程序,也成为安全领域攻防双方的重要工具。本文将带领读者走进Python攻防的世界,从四个方面、五个方面、六个方…

【Java数据结构】详解Stack与Queue(二)

🔒文章目录: 1.❤️❤️前言~🥳🎉🎉🎉 2.栈的应用场景 2.1逆序打印链表 2.2逆波兰表达式求值 2.3括号匹配 2.4出栈入栈次序匹配 2.5最小栈 3. 栈 虚拟机栈 栈帧的区别 4.总结 1.❤️❤️前言~&#x1f973…

零基础构建基于LangChain的聊天机器人(6)

之前的文章: 零基础构建基于LangChain的聊天机器人(1)零基础构建基于LangChain的聊天机器人(2)零基础构建基于LangChain的聊天机器人(3)零基础构建基于LangChain的聊天机器人(4)零基础构建基于LangChain的聊天机器人(5) 设计聊天机器人 现在已经了解了业务需求、数…

关于实习中git的使用

小小实习生,给公司共享了代码,但是还没人审核,所以先创一个test分支 git add . git commmit git push --set-upstream origin niutest 先创建这么个测试环境,等到有人审核通过了,再进行合并 公司的git流程大致是: 开发一个新功能 1.建立一个对应的feat-chat 分支 git…

python-画矩形

题目描述 根据输入的四个参数:a,b,c,f 参数,画出对应的矩形。 前两个参数a,b 为整数,依次代表矩形的高和宽; 第三个参数c 是一个字符,表示用来填充的矩形符号; 第四个参数f 为整数,0 代表空心&a…

Kotlin Jetpack Paging3 和Flow结合使用注意点

本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点 在用DataBinding时要注意DataBinding访问的是静态方法 在kotlin中就要用companion object和JvmStatic class ImageViewBindingAdapter {//里面…

MySQl基础入门⑬.5

创建多表连接查询 表准备 CREATE TABLE 员工信息 (员工号 INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,姓名 VARCHAR(50) NOT NULL,性别 ENUM(男, 女) NOT NULL,出生日期 DATE NOT NULL,部门 VARCHAR(50) NOT NULL,手机号码 VARCHAR(20) NOT NULL,-- 根据数据库不同&#x…

NVIDIA NIM推理微服务集成6款新模型

NIM(NVIDIA Inference Microservice)最新模型实例 得益于不断涌现的突破性基础模型,生成式 AI 正在彻底改变各行各业的几乎所有用例。这些模型能够理解背景和原因,从而生成高质量的内容和高精度答案。 NVIDIA 不断优化和发布新的模型。本文将为您介绍最…

Python入门实践:从基础到应用的全方位探索

Python入门实践:从基础到应用的全方位探索 在数字化浪潮席卷全球的今天,掌握一门编程语言已成为一项重要的技能。而Python,作为一门简洁、易读且功能强大的编程语言,受到了越来越多人的青睐。本文将从四个方面、五个方面、六个方…

ctfshow-web入门-爆破(web25)及php_mt_seed工具的安装与使用

爆个🔨,不爆了 hexdec() 函数用于将十六进制字符串转换为十进制数; 注意: 我最开始做这道题时看错了,误以为随机数的种子直接来自于 flag 的前八位,以为就是 ctfshow{ 这八个字符然后 md5 加密再截取&a…

【DSP】【第六篇】开发支持包

1. SYS/BIOS发展历史 2. 下载链接 全目录链接。 2.1 SYS/BIOS DSP/BIOS和SYS/BIOS链接 2.1.1 DSP/BIOS 2.1.2 SYS/BIOS SYS/BIOS下载链接下图红框标记的是CCSv5可以使用的最新的版本。 2.1.2.1 网络驱动与协议栈 SYS/BIOS组件之网络驱动与协议栈 (1&#xf…

yolov8改进之嵌入Gold层

# 加载模型 model = YOLO("yolov8n.yaml") # 从头开始构建新模型 model = YOLO("yolov8n.pt") # 加载预训练模型(建议用于训练) # 使用模型 model.train(data="coco128.yaml", epochs=3) # 训练模型 metrics = model.val() # 在验证集上评…

【面试题-003】重载和重写的区别

在面向对象编程中,重载(Overloading)和重写(Overriding)是两个不同的概念,它们用于实现多态性: 重载(Overloading): 重载发生在同一个类中,当多个…

2024年Google算法更新打击低质量(如AI生成)内容后,英文SEO优化人员该如何调整谷歌SEO优化策略?

3月5日,谷歌发布了2024年的首次算法更新。与以往更新不同,本次更新更加复杂,这次更新旨在提高搜索结果的质量和相关性,可能对外贸网站排名和流量产生显著影响。也将产生更大的网站数据波动。但在担心自己的网站数据受到影响之前&a…

MYSQL三、MYSQL的函数与约束

一、函数 函数:是指一段可以直接被另一段程序调用的程序或代码。MySQL中的函数主要分为以下四类: 字符串函数、数值函数、日期函数、流程函数。 1、字符串函数 -- concat : 字符串拼接 select concat(Hello , MySQL); -- 输出: Hello M…

通用代码生成器应用场景六,为完善的应用系统收集需求

通用代码生成器应用场景六,为完善的应用系统收集需求 使用急就章功能可以开发一个简单的应用先凑和着使用。此应用系统也可以成为完善的应用系统的原型和祖先。如果您新规划一个完善的应用系统,您可以先使用通用代码生成器生成一个临时使用的系统&#x…

【TB作品】MSP430F5529,单片机,Picture to pixels,乌鸦喝水OLED

功能 Picture to pixels. Use bitmaps to tell a story. Convert pictures to bitmaps and store the bitmaps in a header file. In the main program, draw the pictures on the OLED screen in sequence to tell a story. Use the text to help tell the story 乌鸦喝水故…

Python一般用什么IDE:深入剖析四大主流选择

Python一般用什么IDE:深入剖析四大主流选择 在Python编程的世界里,选择合适的集成开发环境(IDE)对于提升编程效率和体验至关重要。本文将从四个方面、五个方面、六个方面和七个方面,深入剖析Python开发者常用的四大主…

【linux】(1)文件操作及vi

文件和目录的创建 创建文件 touch 命令:创建一个新的空文件。 touch filename.txtecho 命令:创建一个文件并写入内容。 echo "Hello, World!" > filename.txtcat 命令:将内容写入文件。 cat > filename.txt然后输入内容&…