当前位置: 首页 > news >正文

复盘SpringBoot的@Ascyn注解失效问题

复盘SpringBoot的@Ascyn注解失效问题

在实际使用项目中,我们经常会遇到异步与同步任务的线程问题。在我的实际应用项目中也存在一些异步任务,如定时发布消息通知、定期清理任务、异步下载信息同步等,异步应用场景应用相当广泛,而在Spring框架中就为我们搭建了一个快速构建异步任务的方法,本文中将分享我笔记中的错误分析及解决方案。

一、案例分析

在使用@Ascyn注解制作一个异步消息发送时遇到注解失效问题,明明已经为方法加入了注解,为什么无法异步执行,经过检查该异步任务的确处于主线程中执行。

首先一定需要新建配置类AsyncConfig。并开启@EnableAsync写上@Configuration注解。

@EnableAsync@ConfigurationpublicclassAsyncConfig{// to-do...}

简单重现异步失效的代码:

@ServicepublicclassMyAsyncTask{publicvoidstartAsyncTask(){this.asyncTask();}@AsyncpublicvoidasyncTask(){System.out.println("异步任务开始,线程名:"+Thread.currentThread().getName());}publicstaticvoidmain(String[]args){// 直接实例化对象,并且自调用。newMyAsyncTask().startAsyncTask();}}

二、原因分析

经过查阅相关资料后,发现Spring是通过AOP代理的机制来完成异步任务的,如果是从类中的方法调用异步方法,会自动绕过代理机制直接执行该方法,因此注解才会失效。现在我们把代码稍微调整一下:

@ServicepublicclassMyAsyncTask{// 仅外部调用@AsyncpublicvoidasyncTask(){System.out.println("异步任务开始,线程名:"+Thread.currentThread().getName());}}

在类的外部进行调用,如单元测试中使用代理注入,直接调用该异步代码:

@AutowiredMyAsyncTaskmyAsyncTask;@TestvoidcontextLoads(){nmyAsyncTask.asyncTask();}

如果我们一定要在同一类中调用方法,可以将该方法使用context上下文包装为一个代理类,然后同过代理类的方式进行方法的调用:

@AutowiredprivateApplicationContextcontext;// 调用此方法是完全OK的publicvoidcaller(){context.getBean(MyAsyncTask.class).asyncMethod();}

三、常见错误情况

1. 未使用代理方式新建实例

如果使用传统的new MyAsyncTask()方式调用是无法使用的,一定要经过代理,使用@Component@Service@Bean注解的方式调用,才能正常被代理异步。

// 错误示范@TestvoidcontextLoads(){newMyAsyncTask().asyncTask();}

2. 异步方法有返回值

如果异步方法有返回值,那必须是FutureCompletableFuture等类型进行包装返回。

@AsyncpublicCompletableFuture<String>asyncTask(){returnCompletableFuture.completedFuture("result");}

3.@Async 方法抛异常后未被感知

异步方法抛异常但未返回FutureCompletableFuture时,异常不会传播。

// 正确方式@AsyncpublicCompletableFuture<String>asyncMethod(){try{// ...returnCompletableFuture.completedFuture("OK");}catch(Exceptione){returnCompletableFuture.failedFuture(e);}}

四、总结

使用Spring框架虽然方便,但是我们也要用正确的方式使用工具,否则会为我们的工程带来很多复杂的问题,学会如何正确使用@Ascyn注解,推荐阅读这篇文章:Java 注解篇:@Async,更多的情况案例我这里就不罗列了,可以在日常的代码编写中发现问题并寻求解决方案,最后解决我问题的文章也可以分享给大家,非常感谢这篇文章的解答:@Async 注解为什么不生效?如何排查?

http://www.jsqmd.com/news/234613/

相关文章:

  • Spring Boot3集成LiteFlow!轻松实现业务流程编排
  • JavaScript 对大整数(超过 2^53 - 1)的精度丢失问题
  • 香江入梦·西湖共影:陈福善120周年大展在杭州启幕
  • 轻量高效!HY-MT1.5-1.8B模型在边缘设备的实时翻译应用
  • 如何实现专业级翻译?基于HY-MT1.5-7B的术语干预与格式保留实践
  • 使用Alpaca-LoRA微调类ChatGPT模型的实践指南
  • 腾讯开源HY-MT1.5翻译大模型:小参数实现高质量翻译
  • 项目经理能力强不强,看他遇事的反应就知道了!
  • 告别CUDA报错:预置镜像一键运行AI分类器
  • 星哥带你玩飞牛NAS-16:飞牛云NAS换桌面,fndesk图标管理神器上线!
  • 三菱FX3U源码探秘:老司机带你玩转硬核PLC
  • 腾讯混元翻译模型开源|HY-MT1.5实现多语言实时互译
  • 如何在Windows上配置Windows防火墙,零基础入门到精通,收藏这篇就够了
  • 支持术语干预与上下文翻译|HY-MT1.5大模型落地指南
  • 开发者福利:免费 .frii.site 子域名,一分钟申请即用
  • 三菱PLC功能块FB程序集(九个实用案例) - 清晰注释,成熟稳定应用,适用于伺服与变频器通讯...
  • 电机控制工程师的日常调试中,最头疼的就是手里没示波器还要调过零点。今天咱们撸起袖子聊聊无位置BLDC的反电势检测,手把手造个能跑的模型出来
  • vLLM加速HY-MT1.5-7B实战|实现低延迟高精度翻译服务
  • AI分类器商业应用:快速验证创意,成本可控1小时1块
  • AMAT 0100-01588 板
  • 科研党必备PDF提取神器|PDF-Extract-Kit一键实现文档结构化处理
  • PDF智能提取全攻略|基于PDF-Extract-Kit镜像高效解析文档
  • 基于HY-MT1.5的高效翻译实践|边缘部署与实时推理
  • 三菱Q系列PLC控制下的复杂设备自动化系统:精准调控伺服与通讯测试方案
  • 布局检测+OCR识别一体化|PDF-Extract-Kit镜像实践指南
  • 报错FAILED: ninja: ‘out_sys/target/common/obj/JAVA_LIBRARIES/==platform-lib-local_intermediates/
  • Qwen3-VL-WEBUI镜像使用指南|实现图文视频多模态理解
  • STM32驱动无刷直流电机:原理图与驱动程序实现
  • 西门子S7-1200 PLC编程实战详解:TP900触摸屏与多轴伺服控制、结构化编程实现设备与...
  • 一键部署腾讯混元翻译模型|HY-MT1.5镜像使用笔记