@Async 使用和失效情况

2023-05-16

@Async 使用和失效情况

因业务需要,经常会遇到主线程中包含其他关联业务,然关联业务的执行结果对主线程的返回结果没有直接影响或无影响。此时,能让主线程更顺畅的执行,并给客户带来好的客户体验,我们一般会将该关联业务做异步处理或类似的处理(如:消息队列),本文记录自己在项目中使用异步服务的相关经历,以备后期查询使用!

一、Springboot 使用异步任务

1、SpringBootApplication启动类添加@EnableAsync注解;

2、@Async使用

(1)类或者方法中使用@Async注解,类上标有该注解表示类中方法都是异步方法,方法上标有该注解表示方法是异步方法;

(2)@Async(“threadPool”),threadPool为自定义线程池,这样可以保证主线程中调用多个异步任务时能更高效的执行。

3、实例、分析

开启异步服务

@SpringBootApplication
@EnableApolloConfig
@EnableAsync
@ComponentScan(basePackages = {"com.zts"})
public class UserMgmtApplication {

    public static void main(String[] args) {
        SpringApplication.run(UserMgmtApplication.class, args);
    }
}

定义异步类或方法:如果异步方法需要返回值,可以用Future接收

@Service
public class TestServiceImpl implements TestCRMService {

    private Logger logger = LoggerFactory.getLogger(this.getClass());

    @Override
    @Async("testAsync") // 自定义执行线程池
    public void sendMessage() throws Exception {
        /**
         *  业务实现
         */    
    }

    @Override
    @Async("testAsync") // 自定义执行线程池
    public void sendMail() throws Exception {
        /**
         *  业务实现
         */    
    }

}

调用异步方法

    @Autowired
    TestService testService;
    @ResponseBody
    @ResponseStatus(HttpStatus.OK)
    @RequestMapping(value = "/test", method = RequestMethod.GET,
            produces = MediaType.APPLICATION_JSON_VALUE)
    @ApiOperation(notes = "test()", httpMethod = "GET", value = "测试调用多个异步任务")
    public Map<String,Object> runTaskByKettle( ) throws Exception{
        Map<String,Object> result = new HashMap<>();
        try {
            testService.sendMessage();
        } catch (Exception e) {
            e.printStackTrace();
            logger.error("sendMessage任务出现异常");
        }
        try {
            testService.sendMail();
        } catch (Exception e) {
            e.printStackTrace();
            logger.error("sendMail任务出现异常");
        }
        return result;
    }

自定义线程池

@Configuration
@EnableAsync
public class ExecutorConfig {

    /** Set the ThreadPoolExecutor's core pool size. */
    private int corePoolSize = 10;
    /** Set the ThreadPoolExecutor's maximum pool size. */
    private int maxPoolSize = 50;
    /** Set the capacity for the ThreadPoolExecutor's BlockingQueue. */
    private int queueCapacity = 10;

    @Bean
    public Executor testAsync() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(corePoolSize);
        executor.setMaxPoolSize(maxPoolSize);
        executor.setQueueCapacity(queueCapacity);
        executor.setThreadNamePrefix("MgmtExecutor-");

        // rejection-policy:当pool已经达到max size的时候,如何处理新任务
        // CALLER_RUNS:不在新线程中执行任务,而是有调用者所在的线程来执行
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        executor.initialize();
        return executor;
    }

}

至此,Springboot 调用多个异步任务使用实例完成。

@Async注解 分析

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Async {
    String value() default "";
}

通过查看@Async源码可以看出来,@Target 的值是类和方法,所有异步注解可以作用在方法体上面,也可以作用在类上面。

以上是项目使用,可正常使用,因此验证忽略!

二、Spring boot异步任务@Async失效问题

总结:1、启动类是否开启异步服务;

2、在定义异步方法的同一个类中,调用带有@Async注解方法,该方法则无法异步执行;

3、注解的方法必须是public方法,不能是static;

4、没有走Spring的代理类。因为@Transactional和@Async注解的实现都是基于Spring的AOP,而AOP的实现是基于动态代理模式实现的。那么注解失效的原因就很明显了,有可能因为调用方法的是对象本身而不是代理对象,因为没有经过Spring容器管理。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

@Async 使用和失效情况 的相关文章

  • “猿”?“媛”?

    我来自农村 xff0c 父辈告诉我读书是走出这里的唯一途径 xff0c 所以 xff0c 教育在我们家备受重视 高考那年家里发生了一场变故 xff0c 我亲爱的爷爷去世了 xff0c 高考 xff0c 我是一个人跟着学校的车去考试的 xff
  • bootstrap后台 uniform.default.css 使用checkbox 默认选不中问题

    昨天在实际操作中遇见了一个问题 input type 61 39 checkbox 39 设置ckecked 选不中 一直以为是js问题 后来F12看页面发现 是样式的掩盖 lt label gt lt input name 61 34 g
  • linux下安装ffmpeg 语音amr文件为MP3 包含各依赖

    最近安装ffmpeg 转换语音amr文件为MP3 xff0c 在网上查看了很多的版本 xff0c 都是要make 编译 xff0c 而且还有装各种依赖 xff0c 如MP3解码lame等 在官网找到已打包好的文件 xff0c 直接安装 ht
  • 新浪微博与微信公众号开发总结

    微信公众号开发总结 微信公众号开发者文档地址 xff1a https mp weixin qq com wiki t 61 resource res main amp id 61 mp1445241432 可根据文档开始微信者公众号开发 x
  • ROS学习笔记(三)

    元功能包 将plumbing pub sub plumbing server client plumbing param server关联在一起 http wiki ros org catkin package xml Metapackag
  • ELK-filebeat+logstash采集nginx日志

    ELK filebeat 43 logstash采集nginx日志 文章目录 ELK filebeat 43 logstash采集nginx日志 前言采集访问日志第一种方式 xff1a 修改nginx访问日志输出格式为json修改nginx
  • 【计算机系统】CPU是如何运行程序的

    一 CPU组成部分 寄存器 xff1a 存储CPU执行的指令的数据 xff0c CPU每次执行指令都会重新更新寄存器 程序计数器 PC xff1a 记录CPU即将执行的指令内存中的地址 逻辑控制单元 ALU xff1a CPU中负责逻辑计算

随机推荐

  • ubuntu如何分区

    1 swap交换分区 xff0c 一般为你机器内存的两倍 xff0c 少于这个容量 xff0c 系统无法进入休眠 实质是硬盘上的交换空间而非分区 xff0c 所以没有格式 xff0c 默认休眠将数据储存于此 可以取消 xff08 如不用sw
  • git-cola安装与使用

    64 git cola安装与使用 linux下可视化git工具git cola安装与使用 xff08 SSH方式 xff09 链接 https blog csdn net zyhse article details 108813116
  • 家庭百兆升级千兆全攻略

    近日电信把家庭宽带给自动升成了300M xff0c 但奈何家里硬件限制 xff0c 一直都无法享受超快的速度 于是乎 xff0c 只有撸起袖子自己干 xff0c 下面来看看我的踩坑之旅吧 材料准备 千兆光猫6类以上网线 xff0c 最好带屏
  • ubuntu18.04 使用USB串口调试

    1 环境ubuntu18 04 安装了minicom环境 如果没有安装 xff0c 在执行minicom命令时会提示安装 step1 查看连接串口 gt 执行 ls dev tty Tab按键 目标串口 ttyUSB0 ttyUSB1 这个
  • STL详解及常见面试题

    文章目录 一 STL的介绍二 空间配置器详解1 第一级配置器详解2 第二级空间配置器详解3 空间配置器存在的问题 三 各种容器的特点和适用情况四 各种容器的底层机制和常见面试题1 vector xff08 1 xff09 vector的底层
  • VR中的9轴传感器(重力加速度/陀螺仪/磁力计).md

    前言 传感器的调试过程 xff0c 一般根据原厂提供demo代码 xff0c 调试数据接口 xff0c 将数据流打通即可 xff0c 在VR中 xff0c 当带上头显设备 xff0c 运行应用时 xff0c 出现漂移 延迟 不回归问题 xf
  • 数字信号处理 --- 信号分解基础

    信号的分解 重剑无锋 xff0c 大巧不工 信号的分解方式很多 xff0c 大家最常用也最熟知的就是傅里叶变换了 xff0c 然而有很多非常基础的分解方式往往不为人所知 他们的目的都是以某种方法去完美的分解并重建 还原信号 xff0c 闲来
  • leetcode系列-字符串

    字符串 xff1a 总结篇 从字符串的定义到库函数的使用原则 xff0c 从各种反转到KMP算法 什么是字符串 字符串是若干字符组成的有限序列 xff0c 也可以理解为是一个字符数组 反转系列 344 反转字符串 编写一个函数 xff0c
  • CPU种类

    CISC 1 英特尔处理器 xff1a 奔腾 赛扬 酷睿 至强 其中奔腾和赛扬系列定位低端 xff0c 酷睿系列又细分为酷睿i3 i5 i7 分别代表中端 中高端 高端 至强系列主要应用为服务器处理器 奔腾双核 xff0c 赛扬双核 xff
  • “段错误 (核心已转储) ”一种可能原因及其解决方法

    终端在运行的时候总是出现 段错误 核心已转储 栈空间用来存储数组等数据 xff0c 那么段错误就应该是我存储的数组超过了它所在段的大小 xff0c 于是在的程序执行的过程中一到跟大数组相关的步骤就会出现段错误的提示 xff08 SIGSEG
  • 统一javaweb项目和mysql数据库时间UTC时间方法及原理

    统一javaweb项目和mysql数据库时间UTC时间方法及原理 文章目录 统一javaweb项目和mysql数据库时间UTC时间方法及原理 前言UTC时间与 GMT时间时间戳和时区 mysql时间字段解读4种日期类型比如datetime和
  • 【读书笔记】《视觉SLAM十四讲(高翔著)》 第11讲

    文章目录 1 安装gtsam2 程序编译3 程序运行4 用g2o viewer打开 g2o文件 本博客的内容是本章程序编译运行方法 xff0c 记录调通本章程序的过程 处理遇到报错的解决方法 本章程序的详细解析可参考robinhjwy的CS
  • pixhawk: px4代码初学分析:追溯电机控制--pwm输出

    追溯电机控制 pwm输出 正常工作状态下pwm输出过程简述 xff1a 其他状态下pwm输出 xff1a 正常工作状态下pwm输出过程简述 xff1a 姿态解算部分得出姿态控制量通过px4io cpp把姿态控制量发送给IOIO串口读取姿态控
  • feign 调用

    关于feign调用问题 1 引入pom依赖 注释的这个依赖别用 xff0c 这个虽然不报错 xff0c 也好像可以使用 xff0c 但实际是有bug的 xff0c 会导致无法注入bean span class token operator
  • Freemarker 获取controller 传过来的值

    var val 61 entity propertyRight
  • jpa 中的联表查询

    jpa 中的联表查询 ConstructorExpression span class token generics function span class token punctuation lt span SafeOccupationa
  • LocalDate 获取当前月得第一天和最后一天

    span class token keyword public span span class token keyword static span span class token keyword void span span class
  • layui iframe 自定义按钮关闭当前窗口

    1 定义一个button 2 实现方法 formClose 61 function var index 61 parent layer getFrameIndex window name 先得到当前iframe层的索引 parent lay
  • Centos7安装Docker

    0 安装Docker Docker 分为 CE 和 EE 两大版本 CE 即社区版 xff08 免费 xff0c 支持周期 7 个月 xff09 xff0c EE 即企业版 xff0c 强调安全 xff0c 付费使用 xff0c 支持周期
  • @Async 使用和失效情况

    64 Async 使用和失效情况 因业务需要 xff0c 经常会遇到主线程中包含其他关联业务 xff0c 然关联业务的执行结果对主线程的返回结果没有直接影响或无影响 此时 xff0c 能让主线程更顺畅的执行 xff0c 并给客户带来好的客户