场景如下:
业务上调用下层模块响应较慢,改为异步线程调用,防止阻塞别人的线程。
原始代码:
if (XXXX) {
async(XXXXX);
}
@Async("asyncExecutor")
public void async(XXXX) {
XXXX
}
存在问题
Async注解失效,主要原因是因为Async是基于Spring AOP实现,AOP的原理则基于代理模式,此时因为是自己调用自己,使用的不是代理类,没有经过spring容器。
解决方案
if (XXX) {
XXXServiceImpl XXXService =
SpringContextUtil.getBeanOfType(XXXServiceImpl.class);
async(XXXXX);
}
@Async("asyncExecutor")
public void async(XXXX) {
XXXX
}
执行结果:
2020/07/02 15:47:33.76134B3D3BF-60FA-43D9-A799-9BF46011FD0B asyncExecutor-1 [INFO] XXXServiceImpl (XXXServiceImpl.java:197)
方案说明
1.注解的方法必须是public方法。
2.方法一定要从另一个类中调用,也就是从类的外部调用,类的内部调用是无效的。
3.如果需要从类的内部调用,需要先获取其代理类,如上介绍的就是此方法,通过ApplicationContext来获取对应的bean。
4.在启动类上要加入@EnableAsync注解。