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

@Async正确使用姿势

@Async注解可以使被修饰的方法成为异步方法,简单且方便,这篇文章将教你如何正确的使用它


 先谈谈大多数人对@Aysnc的认识:        

        如果直接使用@Async,未指定线程池 并且 容器内也没有beanName为taskExecutor的bean,则会使用org.springframework.core.task.SimpleAsyncTaskExecutor
        注:这个默认的线程池挺坑的,spring官方也不推荐使用


到了springboot2.1.X时代,一切都变了,新增了一个 TaskExecutionAutoConfiguration,他的出现让你可以摆脱SimpleAsyncTaskExecutor带来的苦楚

当然只是一定程度上~~~

先贴个代码:

红框中的是springboot默认给的配置,核心8个,无界队列等等参数,相比SimpleAsyncTaskExecutor还是香了很多不是嘛~~~

那是否可以说:springboot2.1.X就可以直接使用@Async,反正不是SimpleAsyncTaskExecutor了

这句话是不全对的,有场景限制:

        你看看这里还“藏着”一个ConditionalOnMissingBean,表明只要在容器中有Executor这类型得bean,就不会再去注册它

例如:如下代码在项目中手动定义了一个Executor类型的bean并注入到容器中

问题1:

        那是不是只要容器中有自定义的Executor类型得bean,那@Async就又会使用SimpleAsyncTaskExecutor了呢?

并不是,再看一下代码:

这里会去容器中取,如果取不到或者取到了多个会异常,则返回null,那最终使用的就是SimpleAsyncTaskExecutor了


这里回复下问题1:

        如果容器中有Executor类型的bean,那么springboot就不会给我们往容器中注册默认Executor类型bean,这时直接使用@Async和@Async("线程池bean名")是使用的同一个线程池

那问题来了,如果我自定义多个Executor类型得bean并且都注册到容器中,会发生什么呢?

那就会打印一段描述信息,给与我们一些提示:

        More than one TaskExecutor bean found within the context, and none is namedu'taskExecutor'. Mark one of them as primary or name it 'taskExecutor' (possibly " +"as an alias) in order to use it for async processing: " + exgetBeanNamesFound()

这里表明,容器内必须得有一个beanName为 taskExecutor的线程池,否则那就回到最初的起点使用:SimpleAsyncTaskExecutor


总结一下上述:

前提:使用的springboot2.1.X及以上版本

        1. 项目没有自定义Executor注册到容器,那么@Async使用的是springboot默认配置的ThreadPoolTaskExecutor

        2. 项目如果有自定义Executor且只自定义了一个,那么@Async则默认使用的就是它

        3. 项目中自定义了多个Executor,且没有一个beanName为taskExecutor,那么则会使用SimpleAsyncTaskExecut

http://www.lryc.cn/news/274910.html

相关文章:

  • 试除法判定质数算法总结
  • vuetify 回到顶部
  • Socket与TCP的关系
  • RKE安装k8s及部署高可用rancher之证书私有证书但是内置的ssl不放到外置的LB中 4层负载均衡
  • 使用爬虫爬取热门电影
  • 【unity小技巧】实现没有动画的FPS武器摇摆和摆动效果
  • C语言基础知识(6):UDP网络编程
  • 12月笔记
  • 三、C语言中的分支与循环—for循环 (6)
  • tolist()读取Excel列数据,(Excel列数据去重后,重新保存到新的Excel里)
  • ChatGPT大升级,文档图像识别领域迎来技术革新
  • 2023年全国职业院校技能大赛软件测试—测试报告模板参考文档
  • 【BCC动态跟踪PostgreSQL】
  • 汽车架构解析:python cantools库快速解析arxml
  • Vue 之 修饰符汇总
  • 如何通过内网穿透实现无公网IP远程访问内网的Linux宝塔面板
  • 综合跨平台全端ui自动化测试框架Airtest——AirtestIDE录制微信小程序脚本教学
  • 如何在ArcGIS Pro中指定坐标系
  • macOS 老版本系统恢复中出现“MacBook Pro无法与恢复服务器取得联系”
  • [C#]使用OpenCvSharp实现二维码图像增强超分辨率
  • 优化|流形优化系列(一)
  • torch.where()函数
  • 盖子的c++小课堂——第二十三讲:背包问题
  • k8s安装hostPath方式存储的PostgreSQL15
  • 51单片机之按键和数码管
  • 【Oracle】 - 数据库的实例、表空间、用户、表之间关系
  • ssm基于HTML5的交流论坛的设计与实现+vue论文
  • JDBC*
  • Zookeeper注册中心实战
  • 1-02VS的安装与测试