你真的了解@Async吗? | 京东云技术团队
使用场景:
开发中会碰到一些耗时较长或者不需要立即得到执行结果的逻辑,比如消息推送、商品同步等都可以使用异步方法,这时我们可以用到@Async。但是直接使用 @Async 会有风险,当我们没有指定线程池时,他会默认使用其Spring自带的 SimpleAsyncTaskExecutor 线程池,会不断的创建线程,当并发大的时候会严重影响性能。所以可以将异步指定线程池使用
简介:
@Async是Spring的注解,可以加在类或方法上。通俗的来讲,如果加上了这个注解,那么该类或者该方法在使用时将会进行异步处理,也就是创建一个线程来实现这个类或者方法,实现多线程。
线程池的执行顺序:
两种使用方式:
第一种:
使用的是Spring默认的线程池SimpleAsyncTaskExecutor。
接入步骤:
1.需要在@SpringBootApplication启动类或者@configure注解类上 添加注解@EnableAsync启动多线程注解。
2.在需要异步执行的方法上添加@Async注解。
默认的线程池配置:
如果需要修改默认的配置可以在yaml或者properties中添加,修改默认配置:
执行后会打印出你的执行线程名称:
第二种:(推荐使用)
自定义线程池,执行异步。
自定义线程池有如下模式,我们只介绍最后一种:
- 重新实现接口AsyncConfigurer;
- 继承AsyncConfigurerSupport;
- 配置由自定义的TaskExecutor替代内置的任务执行器。
然后添加注解到对应的方法上并指定线程池:asyncExecutor
指定线程池的名称为自定义的线程池名称。
查看日志:
注意事项:
查到了@Async失效的几个原因:
- 注解@Async的方法不是public方法;
- 注解@Async的返回值只能为void或Future;
- 注解@Async方法使用static修饰也会失效;
- 启动类没加@EnableAsync注解;
- 调用方和@Async不能在一个类中;
- 在Async方法上标注@Transactional是没用的,但在Async方法调用的方法上标注@Transcational是有效的;
作者:京东零售 郭春元
来源:京东云开发者社区 转载请注明来源
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Databend 源码阅读: Storage 概况和 Read Partitions
作者:张祖前 Databend Labs 成员,数据库研发工程师 https://github.com/zhyass ❤️友情提示:代码演进较快,请注意文档的时效性哦! 引言 Databend 将存储引擎抽象成一个名为 Table 的接口,源码位于 query/catalog/src/table.rs。 Table 接口定义了 read、append、alter、optimize、truncate 以及 recluster 等方法,负责数据的读写和变更。解释器(interpreter)通过调用 Table trait 的方法生成物理执行的 pipeline。 通过实现 Table 接口的方法,可以定义 Databend 的存储引擎,不同的实现对应不同的引擎。 Storage 主要关注 Table 接口的具体实现,涉及表的元信息,索引信息的管理,以及与底层 IO 的交互。 目录 包名 作用 common/cache 定义与管理缓存,包括磁盘缓存和内存缓存。类型包含表 meta 缓存、查询结果缓存、表数据缓存等。 common/index 定义与使用索引,目前支持 bloom filter...
- 下一篇
慢调用链诊断利器 - ARMS 代码热点
可观测技术背景 从最早的 Google 发表的一篇名为《Dapper, a Large-Scale Distributed Systems Tracing Infrastructure》的论文开始,到后来以:Metrics(指标)、Tracing(链路追踪)以及 Logging(日志)三大方向互为补充的可观测解决方案逐渐被业界所接受并成为事实标准。 基于上述全栈可观测方案技术,诊断一个问题从之前的无从下手或者仅单靠日志变成为如下步骤: 1. 通过 Metrics/Logs 提供的各式各样预设报警发现应用异常信息确定异常模块 2. 对异常模块以及关联日志(Logs)进行查询分析,找到核心的报错信息 3. 通过详细的调用链数据(Tracing)定位到引起问题的代码片段。 基于上述一整套可观测解决方案,不仅可在问题发生后快速定位问题,及时减损,很多时候甚至可以在大故障发生前,就实现对问题的提前发现和解决修复。 监控盲区 是否基于上述一整套可观测解决方案就可以一劳永逸,解决线上任何的监控问题了呢?其实不然,特别是在 Tracing 方面,由于一般其都是基于 Java Agent/SDK 技术方...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS7安装Docker,走上虚拟化容器引擎之路
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS关闭SELinux安全模块
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- Linux系统CentOS6、CentOS7手动修改IP地址