在类中,调用本类的含有@Async注解的异步方法,不能直接调用(带有@Transactional的也是)
public class AsyncService{
public void syncHandleData() {
String name = Thread.currentThread().getName();
System.out.println("-----------线程1------------------"+name);
AsyncService currentProxy = (AsyncService) AopContext.currentProxy();
currentProxy.syncHandleData1();
}
@Async("asyncExecutor")
public CollectionBatch syncHandleData1() {
String name = Thread.currentThread().getName();
System.out.println("-----------线程2------------------"+name);
System.out.println("开始异步处理");
}
}
因为@Async异步是通过spring的Aop动态代理, 若在类中直接调用,相当于this.syncHandleData1的方式,即是通过AsyncService对象直接调用的syncHandleData1方法,而实际上@Async注解异步的实现是通过AsyncService的代理对象调用实现的,所以这样直接调用就让异步无效了。解决的方法有三种:
1.把这个异步方法抽出来放在一个新类里。调用的时候把新类对象通过依赖注入的注解方式放进来直接调用就可以了。因为通过注解注入,那么这个类对象就肯定是由Spring管理的了,Spring容器会对这个类进行一系列的渲染,包括需要用的组件。
2.在AsyncService类中通过Spring上下文获取它的对象(写一个Sprin