news 2026/3/30 5:12:12

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
复盘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 注解为什么不生效?如何排查?

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/27 15:39:24

国产算力适配的翻译大模型|HY-MT1.5生态实践分享

国产算力适配的翻译大模型&#xff5c;HY-MT1.5生态实践分享 在全球化加速推进的今天&#xff0c;跨语言沟通已成为企业出海、科研协作与文化传播的核心需求。然而&#xff0c;传统翻译系统在小语种覆盖、混合语言处理和上下文理解方面仍存在明显短板。腾讯混元团队推出的 HY-…

作者头像 李华
网站建设 2026/3/27 17:51:37

分类器效果翻倍秘诀:云端GPU+最新框架

分类器效果翻倍秘诀&#xff1a;云端GPU最新框架 引言 作为一名长期奋战在AI一线的开发者&#xff0c;我见过太多同行还在用着3年前的本地环境跑分类任务。那些老旧的PyTorch 1.x版本、勉强能用的显卡配置&#xff0c;不仅训练速度慢如蜗牛&#xff0c;还经常因为内存不足而崩…

作者头像 李华
网站建设 2026/3/17 22:32:29

轻量级翻译新标杆|HY-MT1.5-1.8B边缘部署实战解析

轻量级翻译新标杆&#xff5c;HY-MT1.5-1.8B边缘部署实战解析 1. 引言&#xff1a;轻量化翻译模型的现实需求 随着全球化协作日益频繁&#xff0c;高质量、低延迟的实时翻译能力已成为企业与开发者的核心诉求。然而&#xff0c;传统大参数翻译模型往往依赖高性能服务器集群&a…

作者头像 李华
网站建设 2026/3/23 7:41:08

从理论到实践:AI分类算法云端验证全流程

从理论到实践&#xff1a;AI分类算法云端验证全流程 引言&#xff1a;为什么你需要云端验证AI分类算法&#xff1f; 作为一名研究生&#xff0c;你可能正在为论文实验发愁&#xff1a;实验室的GPU资源紧张&#xff0c;排队等待两周才能用上&#xff0c;而毕业deadline却在步步…

作者头像 李华
网站建设 2026/3/26 3:40:22

分类模型效果不好?3步教你云端快速测试改进方案

分类模型效果不好&#xff1f;3步教你云端快速测试改进方案 作为一名算法工程师&#xff0c;最头疼的莫过于发现线上模型效果突然下降。传统本地测试环境搭建耗时耗力&#xff0c;而云平台提供的快速部署能力可以让你像搭积木一样轻松创建多个测试环境。本文将手把手教你如何利…

作者头像 李华