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

21.《SpringBoot 异步编程@Async与CompletableFuture》

SpringBoot 异步编程

文章导读

本文系统讲解 Spring Boot 异步编程的核心技术与实践方案,涵盖从基础使用到高级优化的全链路知识。通过深入剖析 @Async 注解原理、线程池配置策略、异步异常处理机制等关键技术点,结合典型业务场景的代码示例,帮助开发者掌握构建高性能异步系统的核心方法。文章最后提供线程池监控与优化的实战建议。


一、入门篇:基础异步处理

1.1 启用异步支持

在 Spring Boot 主类或配置类添加注解:

@SpringBootApplication
@EnableAsync  // 开启异步处理支持
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}

1.2 基础异步方法

@Service
public class OrderService {@Async  // 标记为异步方法public void processOrderAsync(Order order) {// 模拟耗时操作log.info("开始处理订单:{}", order.getId());sleep(Duration.ofSeconds(3));log.info("订单处理完成:{}", order.getId());}
}

代码说明

  • 方法返回类型必须为 voidFuture 类型
  • 调用方与被调用方必须在不同类中(AOP 代理限制)
  • 默认使用 SimpleAsyncTaskExecutor(非池化)

二、进阶篇:线程池与高级控制

2.1 线程池配置

# application.yml
spring:task:execution:pool:core-size: 5max-size: 20queue-capacity: 100keep-alive: 60sthread-name-prefix: async-exec-

2.2 自定义线程池

@Configuration
public class AsyncConfig {@Bean("customExecutor")public Executor customTaskExecutor() {ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();executor.setCorePoolSize(10);executor.setMaxPoolSize(50);executor.setQueueCapacity(200);executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());executor.setThreadNamePrefix("custom-async-");executor.initialize();return executor;}
}

2.3 带返回值的异步

@Async("customExecutor")
public CompletableFuture<Report> generateReportAsync() {return CompletableFuture.supplyAsync(() -> {// 复杂报表生成逻辑return reportService.generateComplexReport();});
}

2.4 异常处理机制

public class CustomAsyncExceptionHandler implements AsyncUncaughtExceptionHandler {@Overridepublic void handleUncaughtException(Throwable ex, Method method, Object... params) {log.error("异步方法执行异常: {} - {}", method.getName(), ex.getMessage());// 发送报警或进行补偿操作alertService.sendAsyncErrorAlert(method, ex);}
}

三、精通篇:生产级最佳实践

3.1 异步链路追踪

@Async
public CompletableFuture<Void> asyncOperation() {MDC.put("traceId", TracingContext.getCurrentTraceId());try {// 业务逻辑} finally {MDC.clear();}
}

3.2 异步限流控制

@Bean
public Executor rateLimitedExecutor() {Semaphore semaphore = new Semaphore(50);  // 并发许可数return new DelegatedExecutor(Executors.newFixedThreadPool(20), runnable -> {semaphore.acquire();try {runnable.run();} finally {semaphore.release();}});
}

3.3 监控指标体系

@Bean
public ExecutorServiceMonitor executorMonitor(ThreadPoolTaskExecutor executor) {return new ExecutorServiceMonitor(executor.getThreadPoolExecutor(), "order_async_pool");
}

监控关键指标

  • 活跃线程数
  • 队列积压量
  • 拒绝任务数
  • 任务完成平均耗时

四、架构级应用

4.1 异步事件驱动

@EventListener
@Async
public void handleOrderEvent(OrderCreatedEvent event) {// 异步处理领域事件inventoryService.reduceStock(event.getOrder());paymentService.processPayment(event.getOrder());
}

4.2 分布式异步协调

@Async
public CompletableFuture<Boolean> distributedTask() {return CompletableFuture.supplyAsync(() -> {String taskId = distributedService.createTask();while(true) {TaskStatus status = distributedService.getStatus(taskId);if(status.isCompleted()) {return true;}sleep(Duration.ofSeconds(1));}});
}

性能优化建议

  1. 队列容量策略:根据业务特点选择合适队列类型

    • CPU密集型:使用有界队列防止内存溢出
    • IO密集型:使用无界队列提高吞吐量
  2. 拒绝策略选择

    • CallerRunsPolicy:保证任务不丢失
    • DiscardOldestPolicy:适合实时性要求低的场景
  3. 线程池预热

@PostConstruct
public void preheatThreadPool() {IntStream.range(0, corePoolSize).forEach(i -> executor.execute(() -> {}));
}

结语

Spring 异步编程能显著提升系统吞吐量,但需注意:

  1. 避免过度异步化导致线程资源耗尽
  2. 事务边界需要特殊处理(@Transactional 与 @Async 的协作)
  3. 异步任务应做好幂等性设计

通过合理配置线程池参数、完善的监控体系以及正确的架构设计,开发者可以构建出高可靠、高性能的异步处理系统。希望本文能帮助读者全面掌握 Spring 异步编程的精髓。

相关文章:

21.《SpringBoot 异步编程@Async与CompletableFuture》

SpringBoot 异步编程 文章导读 本文系统讲解 Spring Boot 异步编程的核心技术与实践方案&#xff0c;涵盖从基础使用到高级优化的全链路知识。通过深入剖析 Async 注解原理、线程池配置策略、异步异常处理机制等关键技术点&#xff0c;结合典型业务场景的代码示例&#xff0c…...

激光雷达YDLIDAR X2 SDK安装

激光雷达YDLIDAR X2 SDK安装 陈拓 2024/12/15-2024/12/19 1. 简介 YDLIDAR X2官方网址https://ydlidar.cn/index.html‌YDLIDAR X2 YDLIDAR X2是一款高性能的激光雷达传感器&#xff0c;具有以下主要特点和规格参数‌&#xff1a; ‌测距频率‌&#xff1a;3000Hz ‌扫描频…...

大模型在肝硬化风险预测及临床决策中的应用研究

目录 一、引言 1.1 研究背景与意义 1.2 研究目的与创新点 1.3 研究方法与数据来源 二、肝硬化及大模型相关理论基础 2.1 肝硬化概述 2.2 大模型技术原理 2.3 大模型在医疗领域的应用现状 三、大模型预测肝硬化术前风险 3.1 术前风险因素分析 3.2 大模型预测术前风险…...

计算机毕业设计SpringBoot+Vue.js母婴商城(源码+LW文档+PPT+讲解+开题报告)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…...

Java多线程三:补充知识

精心整理了最新的面试资料&#xff0c;有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 Lambda表达式 简介&#xff1a; 希腊字母表中排序第十一位的字母&#xff0c;英语名称为Lambda避免匿名内部类定义过多其实质属于函数式编程的概念 为什么要使用lam…...

计算机网络————(一)HTTP讲解

基础内容分类 从TCP/IP协议栈为依托&#xff0c;由上至下、从应用层到基础设施介绍协议。 1.应用层&#xff1a; HTTP/1.1 Websocket HTTP/2.0 2.应用层的安全基础设施 LTS/SSL 3.传输层 TCP 4.网络层及数据链路层 IP层和以太网 HTTP协议 网络页面形成基本 流程&#xff1a…...

stream流常用方法

1.reduce 在Java中&#xff0c;可以使用Stream API的reduce方法来计算一个整数列表的乘积。reduce方法是一种累积操作&#xff0c;它可以将流中的元素组合起来&#xff0c;返回单个结果。对于计算乘积&#xff0c;你需要提供一个初始值&#xff08;通常是1&#xff0c;因为乘法…...

最新扣子(Coze)案例教程:全自动DeepSeek 写影评+批量生成 + 发布飞书,提效10 倍!手把手教学,完全免费教程

&#x1f468;‍&#x1f4bb;群里有同学是做影视赛道的博主&#xff0c;听说最近DeepSeek这么火&#xff0c;咨询能不能用DeepSeek写影评&#xff0c;并整理电影数据资料&#xff0c;自动发布到飞书文档&#xff0c;把每天的工作做成一个自动化的流程。 那今天斜杠君就为大家…...

数据结构:动态数组vector

vector 是 C 标准库的动态数组。 在C语言中一般初学者会使用malloc&#xff0c;int[n]等方式来创建静态数组&#xff0c;但是这种方式繁琐且容易出错。我们做算法题一般使用动态数组vector&#xff0c; 并且在刷题网站的题目给的输入一般也是vector类型。 示例&#xff1a;vect…...

【HeadFirst系列之HeadFirst设计模式】第9天之模板方法模式:从咖啡和茶到Spring框架,掌握设计模式的精髓

模板方法模式&#xff1a;从咖啡和茶到Spring框架&#xff0c;掌握设计模式的精髓 《Head First 设计模式》是一本经典的设计模式入门书籍&#xff0c;它以轻松幽默的方式讲解了设计模式的核心思想。其中&#xff0c;模板方法模式是一个非常简单但非常实用的设计模式&#xff…...

力扣hot100——排序链表(常见方法,归并排序)

解题思路&#xff1a; 分解&#xff08;Divide&#xff09;&#xff1a;将待排序的列表递归地分成两半&#xff0c;直到每个子列表只包含一个元素&#xff08;此时每个子列表都是有序的&#xff09;。解决&#xff08;Conquer&#xff09;&#xff1a;递归地对每个子列表进行排…...

使用 DeepSeek 和 ECharts 实现大屏数据可视化

引言 在当今数据驱动的时代,数据可视化成为了分析和展示数据的重要手段。大屏数据可视化不仅能够直观地展示数据,还能帮助决策者快速理解复杂信息。本文将介绍如何结合 DeepSeek(一个强大的数据处理与分析工具)和 ECharts(一个流行的数据可视化库)来实现大屏数据可视化。…...

基于springboot+vue的新生报到管理系统

一、系统架构 前端&#xff1a;vue | element-ui | echarts 后端&#xff1a;springboot | mybatis-plus | jwt 环境&#xff1a;jdk1.8 | mysql | maven 二、代码及数据 三、功能介绍 01. 登录 02. 首页 03. 管理员-系统管理-用户管理 04. 管理员-系统…...

【面试系列】Java开发--AI常见面试题

文章目录 1、实际工作或学习中用过哪些Ai工具1.1、AI编程1.2、AI对话聊天1.3、AI图像工具1.4、AI办公工具 2、谈谈你知道的AI领域的一些常见词汇及其含义的理解&#xff1f; 例如AIGC、LLM、DeepLearning分别是什么意思&#xff1f;2.1、AIGC&#xff08;Artificial Intelligen…...

Maven 基础环境搭建与配置(二)

四、本地仓库配置&#xff0c;存储依赖 在 Maven 的世界里&#xff0c;本地仓库就像是一个 “私人储物间”&#xff0c;专门用来存放项目所需的各种依赖构件&#xff0c;如 JAR 包、WAR 包等。当我们构建项目时&#xff0c;Maven 会首先在本地仓库中查找所需的依赖&#xff0c…...

了解ffmpeg,安装并配置环境变量

一、了解FFmpeg FFmpeg 是一个功能强大的开源多媒体框架&#xff0c;能够处理音视频的录制、转换和流媒体传输。它由 Fabrice Bellard 发起&#xff0c;采用 LGPL/GPL 许可证&#xff0c;广泛应用于各种平台&#xff0c;包括 Linux、Windows 和 macOS 什么是FFmpeg&#xff1…...

Deepseek reasoning-content 透出调研

Deepseek reasoning-content 透出调研 部署方式&#xff1a;Docker Ollama Deepseek-R1:8b 参考&#xff1a; https://help.apiyi.com/deepseek-reasoning-content-guide.htmlhttps://yuluo-yx.github.io/blog/%E4%BD%BF%E7%94%A8-Ollama-%E9%83%A8%E7%BD%B2-DeepSeek-%E5…...

Codes 开源免费研发项目管理平台 2025年第一个大版本3.0.0 版本发布及创新的轻IPD实现

Codes 简介 Codes 是国内首款重新定义 SaaS 模式的开源项目管理平台&#xff0c;支持云端认证、本地部署、全部功能开放&#xff0c;并且对 30 人以下团队免费。它通过创新的方式简化研发协同工作&#xff0c;使敏捷开发更易于实施。并提供低成本的敏捷开发解决方案&#xff0…...

Leetcode K个一组翻转链表

双指针法&#xff0c;java solution class Solution {public ListNode reverseKGroup(ListNode head, int k) {if(head null || head.next null) return head;//设置pre和index节点ListNode pre head, index head.next;int m 0;while(m < k && index ! null) …...

电脑开机一段时间就断网,只有重启才能恢复网络(就算插网线都不行),本篇文章直接解决,不要再看别人的垃圾方法啦

下面的是我解决问题的心路历程&#xff0c;不想看的可以直接跳到解决方法上面&#xff01; 内心思路&#xff1a; w11电脑更新过系统后&#xff0c;我的电脑是常年不关机的&#xff0c;但是一天突然断网&#xff0c;试了很多方法都连不上&#xff0c;重启电脑就会好&#xff0…...

零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?

一、核心优势&#xff1a;专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发&#xff0c;是一款收费低廉但功能全面的Windows NAS工具&#xff0c;主打“无学习成本部署” 。与其他NAS软件相比&#xff0c;其优势在于&#xff1a; 无需硬件改造&#xff1a;将任意W…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来

一、破局&#xff1a;PCB行业的时代之问 在数字经济蓬勃发展的浪潮中&#xff0c;PCB&#xff08;印制电路板&#xff09;作为 “电子产品之母”&#xff0c;其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透&#xff0c;PCB行业面临着前所未有的挑战与机遇。产品迭代…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容

基于 ​UniApp + WebSocket​实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配​微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者

抖音增长新引擎&#xff1a;品融电商&#xff0c;一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中&#xff0c;品牌如何破浪前行&#xff1f;自建团队成本高、效果难控&#xff1b;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...

大语言模型如何处理长文本?常用文本分割技术详解

为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

定时器任务——若依源码分析

分析util包下面的工具类schedule utils&#xff1a; ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类&#xff0c;封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz&#xff0c;先构建任务的 JobD…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》

在注意力分散、内容高度同质化的时代&#xff0c;情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现&#xff0c;消费者对内容的“有感”程度&#xff0c;正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中&#xff0…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力

引言&#xff1a; 在人工智能快速发展的浪潮中&#xff0c;快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型&#xff08;LLM&#xff09;。该模型代表着该领域的重大突破&#xff0c;通过独特方式融合思考与非思考…...

【项目实战】通过多模态+LangGraph实现PPT生成助手

PPT自动生成系统 基于LangGraph的PPT自动生成系统&#xff0c;可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析&#xff1a;自动解析Markdown文档结构PPT模板分析&#xff1a;分析PPT模板的布局和风格智能布局决策&#xff1a;匹配内容与合适的PPT布局自动…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命

在华东塑料包装行业面临限塑令深度调整的背景下&#xff0c;江苏艾立泰以一场跨国资源接力的创新实践&#xff0c;重新定义了绿色供应链的边界。 跨国回收网络&#xff1a;废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点&#xff0c;将海外废弃包装箱通过标准…...