• SpringBoot 注解@Async不生效的解决方法【异步处理】


    由于工作需求,逻辑需要异步处理,测试过程中发现异步不生效,请求示例和响应结果展示如下:

    响应结果:

     根据测试用例会发现:线程ID一样,方法 syncData() 和主方法同步执行,异步不生效!

    解决方案一

    同一个类中调用需要先获取代理对象,也就是手动获取对象
    @ResponseBody
    @RequestMapping(path = "/testAsync", method = RequestMethod.GET)
    public String testAsync() throws InterruptedException {
        System.out.println("主方法执行开始......" + Thread.currentThread().getId());
        // 手动获取代理对象
        SpringUtil.getApplicationContext().getBean(ExpenseApplicationCallback.class).syncData();
        System.out.println("主方法执行结束......" + Thread.currentThread().getId());
        return "测试异步完成";
    }
    
    @Async
    public void syncData() throws InterruptedException {
        System.out.println("异步方法执行开始......" + Thread.currentThread().getId());
        Thread.sleep(3000);
        System.out.println("异步方法执行结束......" + Thread.currentThread().getId());
    }
    

     执行结果:

      

     解决方案二

    不同的类调用,直接注入即可
    @ResponseBody
    @RequestMapping(path = "/testAsync", method = RequestMethod.GET)
    public String testAsync() throws InterruptedException {
        System.out.println("主方法执行开始......" + Thread.currentThread().getId());
        // 不同的类直接调用
        expenseApplicationDataService.syncData();
        System.out.println("主方法执行结束......" + Thread.currentThread().getId());
        return "测试异步完成";
    }
    
    
    ExpenseApplicationDataService.java
    @Async
    public void syncData() throws InterruptedException {
        System.out.println("异步方法执行开始......" + Thread.currentThread().getId());
        Thread.sleep(3000);
        System.out.println("异步方法执行结束......" + Thread.currentThread().getId());
    }

    执行结果:

      

    实践总结 

    1、在需要用到的 @Async 注解的类上加上 @EnableAsync,或者直接加在springboot启动类上;
    2、异步处理方法(也就是加了 @Async 注解的方法)只能返回的是 void 或者 Future 类型;
    3、同一个类中调用异步方法需要先获取代理类,因为 @Async 注解是基于Spring AOP (面向切面编程)的,而AOP的实现是基于动态代理模式实现的。有可能因为调用方法的是对象本身而不是代理对象,因为没有经过Spring容器。。。。。。这点很重要,也是经常遇到的

  • 相关阅读:
    java 多线程 一个博客
    akka 入门
    java fork-join框架应用和分析
    基于队列的线程池
    Java线程:新特征-有返回值的线程
    学不好java,仅仅怪你不知道自己错在哪
    hibernate中session的产生方式(openSession、getCurrentSession)
    Leetcode--Best Time to Buy and Sell Stock III
    HDU 1733 Escape(分层网络流)
    儿子关于棒棒糖的诺言
  • 原文地址:https://www.cnblogs.com/blogtech/p/16302481.html
Copyright © 2020-2023  润新知