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并不会起作用。

猜你喜欢

转载自blog.csdn.net/wangpeng322/article/details/84322416