失效原因 1.@SpringBootApplication启动类当中没有添加@EnableAsync注解。
2.异步方法使用注解@Async的返回值只能为void或者Future。
3.没有走Spring的代理类。因为@Transactional和@Async注解的实现都是基于Spring的AOP,而AOP的实现是基于动态代理模式实现的。那么注解失效的原因就很明显了,有可能因为调用方法的是对象本身而不是代理对象,因为没有经过Spring容器管理。
问题代码:
一个类中调用了本类的方法,没有走代理对象。
@PostConstruct
public void test(){
Long a = System.currentTimeMillis();
try {
test1();
test2();
} catch (InterruptedException e) {
e.printStackTrace();
}System.out.println(">>>>>>>"+(System.currentTimeMillis()-a));
}@Async("")
publicvoid test1() throws InterruptedException {
System.out.println(1);
Thread.sleep(10000);
System.out.println(2);
}
@Async("")
publicvoid test2() throws InterruptedException {
System.out.println(3);
Thread.sleep(10000);
System.out.println(4);
}
执行结果就是
1->2->3->4
解决:
增加接口类和实现类
public interface DataService {publicvoid test1();
publicvoid test2();
}
实现类:
@Service
public class DataServiceImpl implements DataService {@Override
@Async("asyncServiceExecutor")
public void test1() {
System.out.println(1);
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(2);
}@Override
@Async("asyncServiceExecutor")
public void test2() {
System.out.println(3);
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(4);
}
}
调用:
@Autowired
private DataService dataService;
@PostConstruct
public void test(){
Long a = System.currentTimeMillis();
dataService.test1();
dataService.test2();
System.out.println(">>>>>>>"+(System.currentTimeMillis()-a));
}
执行结果就是
1->3->2->4 或者1->3->4->2
【Spring|@Async 没有异步执行】
推荐阅读
- Spring|XxlJob分布式任务调度平台
- JAVA随记|Springboot吞吐量优化解决方案
- 人工智能|特斯拉新四化研究(电动化和自动化上一路领先,下一步是共享化)
- Python Json使用
- Redis|基于Redis+Lua的滑动窗口式限流方案
- Leetcode每日刷题|LeetCode.565. 数组嵌套____暴力dfs->剪枝dfs->原地修改
- 搭建微服务架构的基础|Dubbo,SpringCloud,Kubernetes该如何选型()
- java|JAVA-MYSQL-SSH酒店民宿客房管理系统
- java|ssm糖尿病居家健康管理系统,java项目全套代码,小程序+后台管理,mysql数据库