在类中,调用本类的含有@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.把这个异步方法抽出来放在一个新