@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不是“随便加个注解就行”合理的线程池设计和资源隔离至关重要。对于高并发异步任务结合消息队列中间件做异步解耦可以让系统更稳定、性能更可控。

相关新闻

Claude Code架构解析:七层设计与AI工程实践

Claude Code架构解析:七层设计与AI工程实践

1. Claude Code架构全景解析:七层设计哲学与核心运行机制Claude Code作为一个完整的Agent运行时系统,其架构设计体现了对AI工程实践的深刻理解。七层架构从上到下分别是:用户交互层:处理REPL、单次执行和管道模式三种输入方式对话…

2026/7/23 20:23:31阅读更多 →
====C++map(映射)的常用用法

====C++map(映射)的常用用法

Cmap(映射)的常用用法前提&#xff1a;头文件#include 1.map 的定义 &#xff08;1&#xff09;普通定义map map< type1, type2 > mp ; &#xff08;2&#xff09;嵌套定义mapmap套set&#xff08;一对多,自动去重&#xff09; // 一个key对应一堆不重复元素 map<…

2026/7/23 20:23:31阅读更多 →
2026企业级AI编程平台推荐,国内主流企业级AI代码助手市场趋势及选型指南

2026企业级AI编程平台推荐,国内主流企业级AI代码助手市场趋势及选型指南

一、行业发展现状与趋势 全球软件工程领域正在完成从代码补全插件向 AI 编程智能体开发平台的产业跃迁。根据 Gartner《2026 年企业级 AI 代码智能体魔力象限》报告&#xff0c;全球企业级 AI 代码智能体市场年化规模预估达到 98 亿至 110 亿美元&#xff1b;机构预测到 2028 …

2026/7/23 20:23:31阅读更多 →
Python「假多态」与 C++「真多态」的核心区别

Python「假多态」与 C++「真多态」的核心区别

目录 Python「假多态」与 C「真多态」的核心区别 一、先搞懂&#xff1a;C 的「真多态」是什么&#xff1f; 1. 核心实现机制 2. 必须满足的 3 个条件 3. 核心特点 4. C 多态示例代码 二、Python 的「假多态」为什么是「假」的&#xff1f; 1. 核心本质&#xff1a;鸭子…

2026/7/24 0:52:18阅读更多 →
ADIS16470AMLZ是一款工业级微型六轴传感器

ADIS16470AMLZ是一款工业级微型六轴传感器

型号介绍ADIS16470AMLZ 是一款工业级微型六轴 MEMS 惯性测量单元&#xff0c;它拥有行业突出的量程与噪声、零偏指标。陀螺仪支持 2000/s 超大角速度测量范围&#xff0c;适配高速旋转、剧烈机动设备&#xff1b;常温 25℃标准工况下运行零偏稳定性达 8/hr&#xff0c;角度随机…

2026/7/24 0:52:18阅读更多 →
ADXL367BCCZ-RL7,高精度无噪声三轴传感器

ADXL367BCCZ-RL7,高精度无噪声三轴传感器

型号介绍ADXL367BCCZ-RL7 是一款超低功耗三轴数字 MEMS 加速度计&#xff0c;该芯片支持 1.1V 至 3.6V 宽电压输入&#xff0c;主供电引脚 Vs 与数字 IO 供电 VDDIO 共用这一电压区间&#xff0c;可直接匹配单颗纽扣锂电池&#xff0c;内部集成稳压电路&#xff0c;电源抑制比&…

2026/7/24 0:52:18阅读更多 →
ADAS1021KCBZ-RL,集成脉冲 / 阻抗检测的 5 通道低电位采集前端

ADAS1021KCBZ-RL,集成脉冲 / 阻抗检测的 5 通道低电位采集前端

型号介绍ADAS1021KCBZ-RL 是一款高度集成的 5 通道模拟前端&#xff0c;它具备直流导联脱落检测与交流电极接触质量检测两套电路。直流检测覆盖全部 ECG 通道与 RLD 参考电极&#xff0c;检测激励电流、输出极性、脱落判定阈值全部可编程&#xff1b;交流阻抗检测用于评估电极与…

2026/7/24 0:52:18阅读更多 →
面试官:大模型怎么决定 长期记忆是否需要召回?

面试官:大模型怎么决定 长期记忆是否需要召回?

先说结论&#xff1a; 严格来说&#xff0c;并不是大模型单独决定是否召回长期记忆&#xff0c;而是由 Agent Runtime、记忆管理器和大模型共同完成决策。 一、面试时可以这样回答 在一个完整的 AI Agent 系统中&#xff0c;长期记忆是否需要召回&#xff0c;一般不是简单地每…

2026/7/24 0:52:18阅读更多 →
Power BI | 为啥你的 Power BI 刷新巨慢?

Power BI | 为啥你的 Power BI 刷新巨慢?

数据源慢&#xff1f;服务器性能不够&#xff1f; 为什么你的报表刷新巨慢&#xff0c;可能是你没搞懂查询折叠✦ 本期核心问题 不是数据源慢&#xff0c;是你把1200万行全拉到本地算。 01、刷新6分钟&#xff0c;谁都不承认 小李负责的销售日报&#xff0c;每天早上8:30自动刷…

2026/7/24 0:50:18阅读更多 →
Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中&#xff0c;我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源&#xff0c;还是配置文件、证书等&#xff0c;都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下&#xff0c;但这…

2026/7/23 0:56:31阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP&#xff08;轻量级目录访问协议&#xff09;作为企业级身份认证的黄金标准&#xff0c;已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时&#xff0c;发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/23 0:56:31阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”&#xff0c;而是以可解释、可审计、可迭代的方式&#xff0c;赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/23 0:56:31阅读更多 →
我的编程之路:第一篇博客

我的编程之路:第一篇博客

大家好&#xff0c;我是一名编程初学者&#xff0c;同时这也是我编程学习之路上的第一篇博客。在这里&#xff0c;我想要向大家介绍我的一些想法和规划。a.自我介绍我是一个刚刚接触编程的新手&#xff0c;目前在学习c语言&#xff0c;我对编程世界充满了强烈的好奇。当然&…

2026/7/24 0:00:06阅读更多 →
【LeetCode 54】螺旋矩阵

【LeetCode 54】螺旋矩阵

问题描述&#xff1a; 解法&#xff1a; 1、模拟&#xff08;参考自【LeetCode 54】螺旋矩阵-CSDN博客&#xff09; int *spiralOrder(int **matrix, int matrixSize, int *matrixColSize, int *returnSize) {static const int dirs[4][2] {{0, 1}, {1, 0}, {0, -1}, {-1, …

2026/7/24 0:00:06阅读更多 →
2026 WAIC:模型隐身、智能体疯野,厂商竞赛聚焦办公场景与商业闭环

2026 WAIC:模型隐身、智能体疯野,厂商竞赛聚焦办公场景与商业闭环

知春路不相信模型领先今年WAIC大会&#xff0c;昔日AI六小龙来了五家&#xff0c;分别是Kimi、阶跃星辰、Minimax、百川智能、零一万物。连放弃基模的百川和零一万物都来了&#xff0c;唯一缺席的竟是近几个月来风光无限的智谱。&#xff08;DeepSeek一直不参加&#xff09;WAI…

2026/7/24 0:00:06阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时&#xff0c;发现推理速度只有可怜的 1-2 FPS&#xff0c;而别人的演示视频却能跑到 30 FPS 以上&#xff0c;那么问题很可能不在模型本身&#xff0c;而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后&#xff0c;会直接使用官方示例…

2026/7/23 22:58:43阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一&#xff1a;为什么你需要了解 Coze 和 Dify&#xff1f;如果你对 AI 应用开发感兴趣&#xff0c;但一看到“大模型”、“智能体”、“工作流”这些词就头疼&#xff0c;觉得门槛太高&#xff0c;那这篇文章就是为你准备的。很多开发者&#xff0c;包括我自己&#…

2026/7/23 18:58:18阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会&#xff1a;配图一直是个让人头疼的问题。2026年&#xff0c;AI生图工具已经非常成熟了&#xff0c;但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1&#xff1a;速度之王2026年6月11日&#xff0c…

2026/7/23 18:58:18阅读更多 →