SpringBoot 注解@Async不生效的解决方法【异步处理】
由于工作需求,逻辑需要异步处理,测试过程中发现异步不生效,请求示例和响应结果展示如下:
响应结果:
根据测试用例会发现:线程ID一样,方法 syncData() 和主方法同步执行,异步不生效!
解决方案一
1 | 同一个类中调用需要先获取代理对象,也就是手动获取对象 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | @ResponseBody @RequestMapping (path = "/testAsync" , method = RequestMethod.GET) public String testAsync() throws InterruptedException { System.out.println( "主方法执行开始......" + Thread.currentThread().getId()); // 手动获取代理对象 SpringUtil.getApplicationContext().getBean(ExpenseApplicationCallback. class ).syncData(); System.out.println( "主方法执行结束......" + Thread.currentThread().getId()); return "测试异步完成" ; } @Async public void syncData() throws InterruptedException { System.out.println( "异步方法执行开始......" + Thread.currentThread().getId()); Thread.sleep( 3000 ); System.out.println( "异步方法执行结束......" + Thread.currentThread().getId()); } |
执行结果:
解决方案二
1 | 不同的类调用,直接注入即可 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | @ResponseBody @RequestMapping (path = "/testAsync" , method = RequestMethod.GET) public String testAsync() throws InterruptedException { System.out.println( "主方法执行开始......" + Thread.currentThread().getId()); // 不同的类直接调用 expenseApplicationDataService.syncData(); System.out.println( "主方法执行结束......" + Thread.currentThread().getId()); return "测试异步完成" ; } ExpenseApplicationDataService.java @Async public void syncData() throws InterruptedException { System.out.println( "异步方法执行开始......" + Thread.currentThread().getId()); Thread.sleep( 3000 ); System.out.println( "异步方法执行结束......" + Thread.currentThread().getId()); } |
执行结果:
实践总结
1、在需要用到的 @Async 注解的类上加上 @EnableAsync,或者直接加在springboot启动类上;
2、异步处理方法(也就是加了 @Async 注解的方法)只能返回的是 void 或者 Future 类型;
3、同一个类中调用异步方法需要先获取代理类,因为 @Async 注解是基于Spring AOP (面向切面编程)的,而AOP的实现是基于动态代理模式实现的。有可能因为调用方法的是对象本身而不是代理对象,因为没有经过Spring容器。。。。。。这点很重要,也是经常遇到的
分类:
SpringBoot
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架