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

spring boot的@Async注解有什么坑?

Spring Boot 中 @Async 注解的常见坑(2025-2026 真实生产环境高频问题汇总,按严重程度排序)

排名坑的名称严重程度发生概率典型表现/后果解决/规避方案(推荐做法)
1同一个类内部方法调用不生效★★★★★★★★★★内部调用 @Async 方法,仍然同步执行1. 把 @Async 方法抽到另一个 Bean
2. 使用 AopContext.currentProxy()(不推荐)
3. 注入自己(Self Injection)最常用
2没有显式配置 Async 配置类★★★★½★★★★默认单线程池,线程池瞬间打满,所有异步任务排队甚至死锁必须自定义 ThreadPoolTaskExecutor 或使用 @EnableAsync + 自定义配置类
3线程池配置不当导致 OOM/任务堆积★★★★★★★★½队列无限增长 → OOM 或响应极慢合理设置核心/最大线程数 + 有界队列 + 拒绝策略(CallerRunsPolicy 较安全)
4@Async 方法抛异常调用方收不到★★★★★★★★异常被线程池吞掉,调用方完全感知不到1. 方法签名返回 CompletableFuture 并 get() 或 join()
2. 实现 AsyncUncaughtExceptionHandler
5事务失效(@Transactional + @Async)★★★★★★★½异步方法里的事务不生效或不回滚1. 异步方法不要加 @Transactional(推荐)
2. 或者把事务方法和异步方法分开
6使用默认的 SimpleAsyncTaskExecutor★★★½★★★★每次调用都 new 线程,无线程复用,性能极差坚决不要使用默认,必须自定义线程池
7返回 void 的异步方法异常丢失★★★½★★★void 方法抛异常完全无声无息实现 AsyncUncaughtExceptionHandler 或改用返回 Future 类型
8线程上下文丢失(MDC、RequestContext、TenantId 等)★★★★★★½日志 traceId 丢失、租户信息丢失、安全上下文丢失使用 TaskDecorator 包装 Runnable,复制上下文
9@Async 用在静态方法/私有方法★★★★★½压根不生效(AOP 无法代理)只能用在 public 非静态方法上
10大量 @Async 导致线程饥饿★★½★★★核心业务线程池被异步任务占满,导致主流程卡死1. 给不同业务类型使用不同线程池
2. 控制异步任务总量

目前生产环境最推荐的安全写法模板(2025-2026 共识)

@Configuration@EnableAsyncpublicclassAsyncConfigimplementsAsyncConfigurer{@OverridepublicExecutorgetAsyncExecutor(){ThreadPoolTaskExecutorexecutor=newThreadPoolTaskExecutor();executor.setCorePoolSize(8);// 根据机器核数调整executor.setMaxPoolSize(32);executor.setQueueCapacity(500);// 有界队列executor.setThreadNamePrefix("Async-");// 拒绝策略:由调用者线程执行(防止任务丢失)executor.setRejectedExecutionHandler(newThreadPoolExecutor.CallerRunsPolicy());executor.setWaitForTasksToCompleteOnShutdown(true);executor.setAwaitTerminationSeconds(60);executor.initialize();returnexecutor;}// 捕获 void 方法的未捕获异常@OverridepublicAsyncUncaughtExceptionHandlergetAsyncUncaughtExceptionHandler(){return(ex,method,params)->{log.error("异步方法异常!method={}, params={}",method.getName(),params,ex);// 可选:发送告警};}}

总结:最容易踩的 3 个大坑(面试/生产必背)

  1. 同一个类里调用 @Async 方法不生效→ 这是 90% 以上初学者都会踩的坑
  2. 没有自定义线程池→ 默认单线程或无限线程,迟早出事
  3. 异常感知不到 + 上下文丢失→ 日志断层、问题定位困难、生产事故高发

一句话结论:

@Async 看着简单,用好了是性能利器,用不好就是定时炸弹。
生产环境用 @Async 的第一原则:必须自定义线程池 + 必须把异步方法抽到独立的 @Service 类里 + 必须想好异常怎么感知。

如果你目前项目里已经在用 @Async,建议对照上面表格检查一遍配置和使用方式,能省很多半夜被叫醒的麻烦~ 😅

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

相关文章:

  • 如果希望做c++相关的工作,该如何系统学习c++?
  • 2026年专业/多功能/高端/环保定制床垫品牌权威测评榜单重磅发布:北京/上海/广州/深圳定制床垫品牌强势入围 - 一搜百应
  • C++ 腾讯面试有哪些常见问题?
  • 目标检测十年演进
  • AI智能体的开发费用
  • 低成本搭建属于你的证件照制作源码系统 源码全开源 带完整的搭建部署教程
  • nginx a client request body is buffered to a temporary file 错误解决
  • 微信游戏的外包开发流程
  • reinterpret_cast 有哪些注意事项?
  • 中电金信:流程“加速”、投入“瘦身”,当业务建模遇上AI智能体
  • 【小程序毕设全套源码+文档】基于微信小程序的办公用品管理系统小程序设计与实现(丰富项目+远程调试+讲解+定制)
  • flutter入门
  • 【小程序毕设全套源码+文档】基于微信小程序的剧本杀游玩一体化平台设计与实现(丰富项目+远程调试+讲解+定制)
  • 2026年成都月嫂培训机构推荐:基于行业标准与就业率评价,直击培训质量与认证痛点 - 品牌推荐
  • 2026年优秀的文洛温室大棚,,PC阳光板温室大棚厂家优质推荐名录 - 品牌鉴赏师
  • Quest - ce que la langue amricaine
  • 激光雷达十年演进
  • 2026必看:圆锯机推荐供应商及选购建议指南 - 品牌推荐大师1
  • Gorse 协同过滤模型训练详解
  • 毫米波雷达十年演进
  • 【小程序毕设全套源码+文档】基于微信小程序的农产品管理与销售APP设计与实现(丰富项目+远程调试+讲解+定制)
  • 2026年比较好的保温装饰一体板,装饰保温一体板,真石漆保温装饰一体板厂家新品推荐榜 - 品牌鉴赏师
  • new python project setup
  • 【信息科学与工程学】第二篇 材料工程01 材料科学 (1)
  • Napprenez pas lamricain, lukrainien ou le russe
  • 实验用冻干机常见故障诊断与日常维护策略 - 品牌推荐大师
  • STM32F4的CAN升级方案 bootloader源代码,对应测试用app源代码,都是kei...
  • 【小程序毕设源码分享】基于springboot+微信小程序的办公用品管理系统小程序的设计与实现(程序+文档+代码讲解+一条龙定制)
  • 英国硕士留学机构口碑排名发布,学员满意度高备受关注 - 留学机构评审官
  • 2026年留学申请机构推荐:多国申请场景深度评价,针对文书质量与录取率核心痛点 - 品牌推荐