news 2026/4/16 12:27:33

spring项目中业务逻辑涉及异步调用

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
spring项目中业务逻辑涉及异步调用

两种异步模型的分叉点

@Async 和CompletableFuture.supplyAsync(() -> { … }) 正面对比

一、两种写法放一起看 👇
1️⃣ 你现在用的(Spring 推荐,企业级)
@Async
public void runTaskAsync(String pasaTaskId, String daHost, String runPath) {
// 异步逻辑
}

调用:

pasaAsyncService.runTaskAsync(…);

2️⃣ CompletableFuture 写法
CompletableFuture.supplyAsync(() -> {
// 异步逻辑
return result;
});

或:

CompletableFuture.runAsync(() -> {
// 无返回值
});

二、核心区别对比(重点)
对比点 @Async CompletableFuture.supplyAsync
线程池管理 ✅ Spring 统一管理 ❌ 默认 ForkJoinPool
是否推荐在 Spring 项目用 ✅ 强烈推荐 ⚠️ 有条件使用
AOP / 事务 / 安全上下文 ✅ 支持 ❌ 不支持
可读性 ✅ 清晰 ⚠️ 容易变复杂
任务编排 ❌ 一般 ✅ 非常强
异常处理 try-catch exceptionally / handle
适合场景 后台任务、接口触发 并行计算 / 流式处理
三、最关键的一点(90% 的坑)
❌ CompletableFuture 默认线程池是:
ForkJoinPool.commonPool()

问题:

❌ 和 JVM 里所有 CompletableFuture 共用

❌ 容易被 CPU 密集任务拖死

❌ 和 Spring 事务、日志 MDC、SecurityContext 无关

👉 在 Web 后台 / 微服务 中,不推荐直接用默认写法

四、如果你非要用 CompletableFuture,正确姿势是这样
✔ 指定线程池(否则不如不用)
CompletableFuture.runAsync(
() -> {
// 业务逻辑
},
pasaExecutor // Spring 注入的线程池
);

这样 本质上和 @Async 是一回事

五、结合你现在这个业务:该选哪个?
你的场景回顾

点击按钮 → 调 DA 接口

不关心返回值

不阻塞接口

需要日志、状态、可控线程

✅ 最优解(你现在的)
@Async
public void runTaskAsync(…) { … }

这是标准后台任务写法,没有任何问题

六、什么时候 CompletableFuture 更适合?
适合 CompletableFuture 的典型场景
CompletableFuture f1 = …
CompletableFuturef2 = …

CompletableFuture result =
f1.thenCombine(f2, (a, b) -> …)
.thenApply(…)
.exceptionally(…)

✔ 并行查询
✔ 聚合结果
✔ 链式处理
✔ 有返回值

👉 偏“计算 / 编排”

七、一句话结论

🔥 Spring 项目中:

接口触发、后台执行 → @Async

并行计算、结果编排 → CompletableFuture + 自定义线程池

❌ 永远不要在 Web 项目里裸用 CompletableFuture.supplyAsync()

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/15 19:54:42

基于SMO滑模观测器算法的永磁同步电机无传感器矢量控制

基于SMO滑模观测器算法的永磁同步电机无传感器矢量控制的仿真模型C代码: 1. 完整的SMO滑模观测器算法的C代码,本人已经成功移植到DSP(TMS320F28335)芯片中,在一台额定功率为45kW的永磁同步电机的变频器中加以应用&…

作者头像 李华
网站建设 2026/4/13 21:23:35

MySQL 8.0安装

一、MySQL 8.0安装前准备工作 (一)下载MySQL 8.0安装包 官网下载: 打开浏览器,访问 MySQL 官方网站在下载页面中,找到 “MySQL Community Server” 选项,点击 “Download” 按钮。选择适合自己操作系统的…

作者头像 李华
网站建设 2026/4/16 10:59:40

Java+React全栈开发面试宝典(完整60题)

📌 Java后端篇(15题) 1. 说说JVM的内存结构? 答案框架(记忆口诀:堆栈方本程) JVM内存分为5个区域: 堆(Heap):存放对象实例,是GC的主要区域,分为新生代(Eden、S0、S1)和老年代 栈(Stack):每个线程私有,存局部变量、方法调用,栈帧包含局部变量表、操作数…

作者头像 李华
网站建设 2026/4/12 8:48:40

CCF-GESP计算机学会等级考试2025年12月四级C++T2 优先购买

B4452 [GESP202512 四级] 优先购买 题目描述 小 A 有 MMM 元预算。商店有 NNN 个商品,每个商品有商品名 SSS、价格 PPP 和优先级 VVV 三种属性,其中 VVV 为正整数,且 VVV 越小代表商品的优先级越高。 小 A 的购物策略为: 总是优先…

作者头像 李华
网站建设 2026/4/13 4:14:23

net美食点餐系统 校园外卖跑腿系统vue骑手

目录已开发项目效果实现截图关于博主开发技术介绍核心代码参考示例1.建立用户稀疏矩阵,用于用户相似度计算【相似度矩阵】2.计算目标用户与其他用户的相似度系统测试总结源码文档获取/同行可拿货,招校园代理 :文章底部获取博主联系方式!已开发…

作者头像 李华
网站建设 2026/4/11 21:22:59

日语补助动词

一、什么是补助动词?(先给核心) 补助动词是:本来是动词,但失去原本具体意义, 接在「て形」或「连用形」后, 用来补充说明动作的状态、方向、完成度、态度等📌 常见特点: …

作者头像 李华