@Async 线程池踩坑指南
在 Spring 项目中Async可以让方法异步执行提高系统吞吐量。但是如果不注意线程池的配置很容易踩坑导致数据库连接耗尽、任务阻塞甚至系统崩溃。本文结合实际案例分享Async的坑点、解决方案以及如何通过消息队列中间件做异步解耦提高系统稳定性。1. 问题现象某项目需要给400 人发送会议通知每个人触发一个异步通知保存操作。结果出现了严重问题数据库连接池瞬间耗尽系统报错甚至崩溃异步任务执行混乱显然这并不是单纯的异步问题而是线程池配置导致的资源抢占。2. 根本原因2.1 Async 默认线程池的坑Spring 中如果Async没有指定线程池会使用SimpleAsyncTaskExecutor特点 - 无核心线程每次调用都创建新线程 - 无队列任务直接提交到线程执行也就是说400 个通知 400 个并发线程同时抢数据库连接 → 连接池瞬间爆满默认线程池适合轻量异步任务不适合批量任务或数据库密集型任务。2.2 为什么项目里全用 flowable-async 线程池项目中定义了一个Primary的applicationTaskExecutorflowable-async-*PrimaryBean(nameapplicationTaskExecutor)publicThreadPoolTaskExecutorapplicationTaskExecutor(){// core CPU核数 * 2, max core * 2}Spring 默认把所有 Async 调用都路由到这个池。问题是通知任务大量抢占 flowable 的线程flowable 自己的异步任务反而没线程可用这就造成了业务互相干扰性能反而下降。3. 解决方案3.1 创建专用线程池为高并发通知任务单独创建线程池Bean(namenoticeTaskExecutor)publicThreadPoolTaskExecutornoticeTaskExecutor(){intcpuCoresRuntime.getRuntime().availableProcessors();intcorePoolSizeMath.min(Math.max(2,cpuCores),3);intmaxPoolSizeMath.min(corePoolSize*2,8);intqueueCapacity50000;ThreadPoolTaskExecutorexecutornewThreadPoolTaskExecutor();executor.setCorePoolSize(corePoolSize);executor.setMaxPoolSize(maxPoolSize);executor.setQueueCapacity(queueCapacity);executor.setThreadNamePrefix(async-event-);executor.setWaitForTasksToCompleteOnShutdown(true);executor.setRejectedExecutionHandler(newThreadPoolExecutor.CallerRunsPolicy());executor.initialize();log.info(Async DB TaskExecutor initialized: core{}, max{}, queue{}, rejectPolicyCallerRuns,corePoolSize,maxPoolSize,queueCapacity);}3.2 指定 Async 使用专用池在异步方法上指定线程池或者把上述链接池配置改成全局连接池配置Async(noticeTaskExecutor)// 指定线程池名称EventListenerpublicvoidlisten(NoticeRecordSaveEventevent){// 执行通知保存逻辑}这样业务任务不会抢占 flowable 线程数据库连接池不会瞬间耗尽异步执行可控、稳定3.3 更进一步异步解耦到消息队列中间件当异步任务量大、数据库或业务资源有限时可以考虑消息队列解耦生产者只负责发送消息到队列如 RabbitMQ、Kafka、RocketMQ消费者从队列异步消费处理通知逻辑可以自由控制消费并发数、批量处理、重试机制这样可以达到流量削峰大量任务不会瞬间占用数据库连接业务解耦通知逻辑与主业务线程分离系统稳定异步任务可按队列速率消费不会刷爆线程池结合 Spring消息队列的消费端也可以结合专用线程池控制并发BeanpublicThreadPoolTaskExecutornoticeConsumerExecutor(){ThreadPoolTaskExecutorexecutornewThreadPoolTaskExecutor();executor.setCorePoolSize(3);executor.setMaxPoolSize(10);executor.setQueueCapacity(2000);executor.setThreadNamePrefix(notice-consumer-);executor.initialize();returnexecutor;}总结Async 专用线程池适合中小量异步任务高并发或跨系统异步场景建议结合消息队列做解耦。4. 总结原则说明Async 必须指定线程池否则用 SimpleAsyncTaskExecutor无限创建线程不同业务用不同线程池避免相互影响通知用专用池执行方法不加事务事务在同步调用层管理异步只管执行线程池大小参考连接池容量corePoolSize 不要超过数据库连接数高并发异步建议消息队列解耦队列削峰、异步消费、系统更稳定 小结Async不是“随便加个注解就行”合理的线程池设计和资源隔离至关重要。对于高并发异步任务结合消息队列中间件做异步解耦可以让系统更稳定、性能更可控。

相关新闻

一图读懂:科源制药医药主业筑基,脑机接口与具身智能打开成长空间

一图读懂:科源制药医药主业筑基,脑机接口与具身智能打开成长空间

今年3月,科源制药通过全资子公司参股成立北京航脑科技有限公司,正式切入脑机接口赛道;6月,航脑科技与仿生人形机器人企业EXROBOT签署战略合作协议,并计划成立合资公司。短短三个月内,科源制药从一家典型的化…

2026/10/29 17:23:01 阅读更多 →
高性能时钟分配芯片LMK01000:原理、设计与实战应用指南

高性能时钟分配芯片LMK01000:原理、设计与实战应用指南

1. 芯片概览与核心价值在高速数字系统设计的江湖里,时钟信号就像是整个系统的“心跳”。这颗心跳的强弱、节奏是否稳定,直接决定了系统能否跑得稳、跑得快。无论是5G基站里处理海量数据的FPGA和ADC,还是医疗CT机里对时序精度要求苛刻的数据采…

2026/10/25 9:14:15 阅读更多 →
2026 年教师评职称论文:别让假文献与 Word 格式拖慢材料准备

2026 年教师评职称论文:别让假文献与 Word 格式拖慢材料准备

从真实文献、期刊格式到全文逻辑检查,一次拆清职称论文该怎么选工具先说结论 生成一段“像论文的话”并不难,难的是让文献可核验、格式符合目标期刊要求、全文论证经得住编辑与同行审阅。单点工具各有用处;需要把写作、检索、排版和检查串起…

2026/10/29 10:41:33 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/10/31 0:19:11 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/10/31 10:20:19 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/10/31 10:20:23 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/10/31 0:59:28 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/10/31 10:30:19 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/10/31 9:29:43 阅读更多 →

日新闻

周新闻

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/30 17:32:24 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/31 11:00:40 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/31 0:09:01 阅读更多 →