news 2026/2/22 21:56:45

复盘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/2/8 6:21:39

跨语言分类实战:处理小语种的特殊技巧

跨语言分类实战&#xff1a;处理小语种的特殊技巧 引言 当NGO组织需要处理非洲方言内容时&#xff0c;往往会遇到一个棘手的问题&#xff1a;主流AI模型通常只支持英语、法语等大语种&#xff0c;而像斯瓦希里语、豪萨语等非洲方言却难以识别。这就好比给一个只会说中文的人一…

作者头像 李华
网站建设 2026/2/19 14:23:26

同规模领先水平:HY-MT1.8B翻译模型性能实测揭秘

同规模领先水平&#xff1a;HY-MT1.8B翻译模型性能实测揭秘 1. 引言&#xff1a;轻量级翻译模型的工程突破 1.1 背景与挑战 在多语言交流日益频繁的今天&#xff0c;高质量、低延迟的机器翻译已成为智能应用的核心能力。然而&#xff0c;传统大参数翻译模型虽具备较强语义理…

作者头像 李华
网站建设 2026/2/21 6:45:00

STM32驱动无刷直流电机:原理图与驱动程序实现

一、核心结论 STM32驱动无刷直流电机&#xff08;BLDC&#xff09;的核心架构为&#xff1a;STM32微控制器&#xff08;如F103、F407&#xff09;通过高级定时器生成互补PWM信号&#xff0c;驱动三相桥逆变电路&#xff0c;结合霍尔传感器&#xff08;或反电动势检测&#xff0…

作者头像 李华
网站建设 2026/2/22 2:18:18

支持33种语言互译|HY-MT1.5-7B大模型镜像深度实践

支持33种语言互译&#xff5c;HY-MT1.5-7B大模型镜像深度实践 在多语言交流日益频繁的今天&#xff0c;高质量、低延迟的翻译服务已成为智能应用的核心能力之一。腾讯近期开源的 HY-MT1.5 系列翻译模型&#xff0c;凭借其“小模型快部署、大模型强性能”的双轨设计&#xff0c…

作者头像 李华
网站建设 2026/2/19 15:04:06

NEC RC-48DX 模块

NEC RC-48DX 模块概述NEC RC-48DX 是一款由日本电气&#xff08;NEC&#xff09;开发的通信或控制模块&#xff0c;通常用于工业自动化、数据采集或远程控制场景。该模块可能具备数字输入/输出&#xff08;I/O&#xff09;、模拟信号处理或网络通信功能&#xff0c;具体特性需结…

作者头像 李华
网站建设 2026/2/19 22:17:34

格式不丢失、术语可干预|HY-MT1.5-7B让翻译真正可用在生产环境

格式不丢失、术语可干预&#xff5c;HY-MT1.5-7B让翻译真正可用在生产环境 随着全球化进程的加速&#xff0c;跨语言内容处理已成为企业出海、技术文档本地化、智能硬件多语种支持等场景的核心需求。然而&#xff0c;传统机器翻译服务在实际落地中常面临三大挑战&#xff1a;专…

作者头像 李华