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()

相关推荐

  1. Spring异步注解@Async使用及其自定义线配置

    2024-06-09 06:38:02       39 阅读
  2. Spring Boot中异步线@Async

    2024-06-09 06:38:02       45 阅读
  3. 任务调度与执行C++线

    2024-06-09 06:38:02       24 阅读
  4. Spring Boot中配置@Async线拒绝策略

    2024-06-09 06:38:02       56 阅读
  5. 线执行流程

    2024-06-09 06:38:02       58 阅读
  6. spring boot 线应用

    2024-06-09 06:38:02       35 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-09 06:38:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-09 06:38:02       100 阅读
  3. 在Django里面运行非项目文件

    2024-06-09 06:38:02       82 阅读
  4. Python语言-面向对象

    2024-06-09 06:38:02       91 阅读

热门阅读

  1. LeetCode题练习与总结:三角形最小路径和--120

    2024-06-09 06:38:02       30 阅读
  2. Sony前端连接功放:深度解析与实用指南

    2024-06-09 06:38:02       34 阅读
  3. Linux服务器配置一个简单的DNS

    2024-06-09 06:38:02       27 阅读
  4. 【 k8s 标签与选择器 】

    2024-06-09 06:38:02       29 阅读
  5. adb 删除文件或文件夹

    2024-06-09 06:38:02       31 阅读
  6. 字母异位词分组(charyw)

    2024-06-09 06:38:02       39 阅读
  7. Docker面试整理-什么是Docker Compose?

    2024-06-09 06:38:02       28 阅读