SpringBoot学习 第二十三篇:使用@Async异步调用方法

参考:

https://blog.csdn.net/Dongguabai/article/details/80782081

https://blog.csdn.net/dongguabai/article/details/80788585

 

有时间一些比较耗时的方法需要使用异步调用,之前会自己维护一个线程池,然后异步调用,也比较麻烦,但是在Spring环境下可以一个@Async轻松搞定。

SpringBoot要使用@Async需要以下两个步骤:

1.使用@EnableAsync开启异步;

2.定义Spring组件,使用@Component和@Async;

示例:

使用@EnableAsync开启异步:

定义Spring组件,使用@Component和@Async:

测试用的Controller:

异步方法执行成功,可以看到有个日志打印出来了,这个是Spring打印的日志,因为我们没有指定异步执行的executor,在第一次执行的时候会找不到executor,会返回null,由Spring默认的executor去执行,这个以后有时间再记录。

其实异步注解代理的方法可以有一个返回值Future<T>,可以用isCancelled判断异步任务是否取消,isDone判断任务是否执行结束,get获取返回结果。

但是有一个要注意的是在使用不当的时候这个@Async注解会失效(原因和@Transactional注解有时候会失效的原因一样):

@Async和@Transactional注解本质使用的是动态代理,应该是代理对象调用被@Async或者@Transactional标记的方法。其实Spring容器在初始化的时候Spring容器会将含有AOP注解的类对象“替换”为代理对象(简单这么理解)。如果调用方法的是对象本身而不是代理对象,因为没有经过Spring容器,所以@Async和@Transactional并不会起作用。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值