@Async注解失效,解决方案

1,456 阅读1分钟

场景如下:

业务上调用下层模块响应较慢,改为异步线程调用,防止阻塞别人的线程。

原始代码:

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注解。