欢迎来到代码驿站!

JAVA代码

当前位置:首页 > 软件编程 > JAVA代码

java SpringBoot注解@Async不生效的解决方法

时间:2022-07-06 10:16:42|栏目:JAVA代码|点击:

SpringBoot 注解@Async不生效的解决方法

问题描述:

在这里插入图片描述

这里虽然加了@EnableAsync@Async,但是异步请求依然没有生效

解决方案:

方法一:

同一个类中调用需要先获取代理对象,也就是手动获取对象

@Service
@EnableAsync
public class DemoService {
    public void add(){
        DemoService bean = SpringUtil.getBean(DemoService.class);
        System.out.println("开始");
        bean.sendToKafka();
        System.out.println("结束");
    }
    @Async
    public void sendToKafka() {
        try {
            Thread.sleep(10000);
            System.out.println("我睡醒了!!!");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

方法二:

不同的类调用,直接注入即可

AsyncHandle.java (异步处理类)

@Service
@EnableAsync
public class AsyncHandle {
    @Async
    public void sendToKafka() {
        try {
            Thread.sleep(10000);
            System.out.println("我睡醒了!!!");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

DemoService.java (业务类)

@Service
public class DemoService {
    @Autowired
    private AsyncHandle asyncHandle;
    
    public void add(){
        System.out.println("开始");
        asyncHandle.sendToKafka();
        System.out.println("结束");
    }
}

总结:

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

上一篇:Java/Android 实现简单的HTTP服务器

栏    目:JAVA代码

下一篇:springBoot中的properties配置解析

本文标题:java SpringBoot注解@Async不生效的解决方法

本文地址:http://www.codeinn.net/misctech/206948.html

推荐教程

广告投放 | 联系我们 | 版权申明

重要申明:本站所有的文章、图片、评论等,均由网友发表或上传并维护或收集自网络,属个人行为,与本站立场无关。

如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

联系QQ:914707363 | 邮箱:codeinn#126.com(#换成@)

Copyright © 2020 代码驿站 版权所有