news 2026/6/15 12:06:41

复盘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/6/13 11:05:13

布局检测+OCR识别一体化|PDF-Extract-Kit镜像实践指南

布局检测OCR识别一体化&#xff5c;PDF-Extract-Kit镜像实践指南 1. 引言&#xff1a;智能文档提取的工程化需求 在现代企业级应用中&#xff0c;非结构化文档&#xff08;如PDF、扫描件&#xff09;的自动化处理已成为提升效率的关键环节。传统OCR技术仅能实现“文本搬运”&…

作者头像 李华
网站建设 2026/6/9 23:26:41

西门子PLC1500与Fanuc机器人焊装系统集成方案

西门子PLC1500大型fanuc机器人焊装 包括1台西门子1500PLC程序&#xff0c;2台触摸屏TP1500程序 9个智能远程终端ET200SP Profinet连接 15个Festo智能模块Profinet通讯 10台Fanuc发那科机器人Profinet通讯 3台G120变频器Profinet通讯 2台智能电能管理仪表PAC3200 4个GRAPH顺控程…

作者头像 李华
网站建设 2026/6/4 23:29:17

2024最佳AI分类工具:技术小白也能用的TOP5

2024最佳AI分类工具&#xff1a;技术小白也能用的TOP5 引言 作为一名刚转行的产品经理&#xff0c;你可能经常需要处理各种分类任务——从用户反馈归类到竞品分析&#xff0c;再到市场数据整理。传统方法要么耗时耗力&#xff0c;要么需要编程基础&#xff0c;这让非技术背景…

作者头像 李华
网站建设 2026/6/10 17:37:23

构建企业级翻译中台|HY-MT1.5-7B与1.8B双模部署实践

构建企业级翻译中台&#xff5c;HY-MT1.5-7B与1.8B双模部署实践 在跨国协作、跨境电商、多语言内容生产日益频繁的今天&#xff0c;企业对翻译服务的需求已从“能用”转向“精准、低延迟、可定制、数据可控”。传统商业翻译API虽覆盖语种广泛&#xff0c;但在术语一致性、上下…

作者头像 李华