欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-03-02 18:42:19
目录问题描述:解决方案:总结:springboot 注解@async不生效的解决方法问题描述:这里虽然加了@enableasync和@async,但是异步请求依然没有生效解决方案:方法一:同一个类中调...

springboot 注解@async不生效的解决方法

问题描述:

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 springboot注解@async不生效的解决方法的文章就介绍到这了,更多相关springboot注解@async不生效内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!

相关标签: SpringBoot @Async