讨论一下 spring boot 下 使用 spring 异步执行的注解
先看下这个类:
这个类是 spring boot auto configure 下完成 TaskExecutor的自动配置。
1. 需要在类路径存在 ThreadPoolTaskExecutor,这个类是 是spring context模块下的类,也就是 需要引入 spring context 依赖,这个基本都会引入
2. 标识为配置类
3. taskExecution的属性配置
如果不存在TaskExecutorBuilder类型的bean,这在这里注册默认的TaskExecutorBuilder。
默认的线程池:
1. 队列大小: 最大
2. 核心线程数: 8
3. 最大线程数:8
4.
如果不存在 Executor类型的bean,这使用builder构建一个。
这个Executor 是 jdk中的线程池的顶级父类,也就是 如果 容器中存在这个线程池bean,就不构建了。
如果不想使用默认的,可以自己定义:
ThreadPoolTaskExecutor 内部构建的就是 JDK提供的 ThreadPoolExecutor
此时,不论是 用默认的 还是 自定义的,线程容器中已经存在了 一个 线程池。
当 使用 @Async 注解类 描述一个方法时,发生了什么?
不出意外的话,这里应该是 使用的 AOP实现的。
@EnableAsync注解 使用 importSelector注册。
这里默认的 模式 是PROXY
注册一个 bean的名称为 org.springframework.context.annotation.internalAsyncAnnotationProcessor
类型为:AsyncAnnotationBeanPostProcessor
这里获取 @Async 指定的 处理器,如果没指定就用默认的。
一般都是 直接提交任务。
到这里 基本OK。
注意两点:
1. @EnableAsync 开启异步能力
2. 适当自定义线程池
处理 使用 @Bean,这种方式也可以,不过 这个在调用的时候才创建