Spring Boot 异步返回对象深度解析
前言
在现代高并发、高响应的应用场景中,Spring Boot 的异步处理能力是提升系统吞吐量和用户体验的关键技术之一。无论是实时数据推送、大文件传输,还是复杂异步任务调度,Spring Boot 提供了多种灵活的异步处理机制以满足不同需求。本文将从实际开发角度出发,系统解析 Spring Boot 中常见的异步处理方式,包括但不限于 DeferredResult、ResponseBodyEmitter 等特殊返回对象。
一、核心对象对比
| 对象 | 传输方式 | 特性 | 适用场景 | 协议支持 |
|---|---|---|---|---|
DeferredResult | 单次响应 | 线程间解耦、可跨请求处理结果 | 长轮询、第三方回调、异步任务处理 | 通用 HTTP |
ResponseBodyEmitter | 分块流式传输 | 支持多次数据发送、自动处理内容类型 | 分块传输日志、实时进度条 | HTTP 1.1+ |
SseEmitter | 事件流 | 符合 SSE 规范、自动重连、事件结构化 | 实时股票行情、聊天消息推送、监控数据流 | Server-Sent Events |
StreamingResponseBody | 一次性流式写入 | 直接操作 OutputStream、内存占用低 | 大文件下载、视频流传输 | 通用 HTTP |
二、详细说明与示例
1. DeferredResult(延迟结果)
特点:
- 通过其他线程设置结果值(如 MQ 消费者、定时任务)
- 支持超时处理和回调方法(onCompletion/onTimeout)
- 适用于需要外部事件触发的场景
代码示例:
@GetMapping("/order/status")
public DeferredResult<String> checkOrderStatus() {DeferredResult<String> deferredResult = new DeferredResult<>(30000L, "Timeout!");// 模拟异步处理(如MQ监听)CompletableFuture.runAsync(() -> {try {Thread.sleep(5000);deferredResult.setResult("ORDER_COMPLETED");} catch (Exception e) {deferredResult.setErrorResult(e);}});return deferredResult;
}
2. ResponseBodyEmitter(响应体发射器)
特点:
- 支持多次
send()方法分块发送数据 - 自动处理
Content-Type: text/event-stream - 需要自行管理数据格式
代码示例:
@GetMapping("/progress")
public ResponseBodyEmitter showProgress() {ResponseBodyEmitter emitter = new ResponseBodyEmitter();Executors.newSingleThreadExecutor().submit(() -> {for (int i = 0; i <= 100; i += 10) {try {emitter.send("Progress: " + i + "%\n");Thread.sleep(1000);} catch (Exception e) {emitter.completeWithError(e);break;}}emitter.complete();});return emitter;
}
3. SseEmitter(SSE 发射器)
特点:
- 符合 W3C SSE 规范(事件 ID、重试机制)
- 浏览器自动重连(默认 3 秒)
- 结构化事件发送(event/data/id)
代码示例:
@GetMapping("/stock")
public SseEmitter streamStockPrices() {SseEmitter emitter = new SseEmitter(60000L);ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);scheduler.scheduleAtFixedRate(() -> {try {StockPrice price = stockService.getLatestPrice();emitter.send(SseEmitter.event().id(UUID.randomUUID().toString()).name("stockUpdate").data(price));} catch (IOException e) {scheduler.shutdown();}}, 0, 1, TimeUnit.SECONDS);return emitter;
}
4. StreamingResponseBody(流式响应体)
特点:
- 直接操作底层 OutputStream
- 适合处理二进制数据流
- 需要手动设置 Content-Type
代码示例:
@GetMapping("/download")
public StreamingResponseBody downloadLargeFile() {return outputStream -> {try (InputStream in = new FileInputStream("/data/large.zip")) {byte[] buffer = new byte[4096];int bytesRead;while ((bytesRead = in.read(buffer)) != -1) {outputStream.write(buffer, 0, bytesRead);outputStream.flush();}}};
}
三、场景选择指南
| 需求场景 | 推荐方案 | 补充说明 |
|---|---|---|
| 实时聊天消息推送 | SseEmitter | 利用浏览器自动重连机制 |
| 文件下载/视频流 | StreamingResponseBody | 直接操作字节流效率更高 |
| 需要与第三方系统交互的长耗时操作 | DeferredResult | 通过 MQ 或回调通知结果 |
| 分阶段显示处理进度(如数据导入) | ResponseBodyEmitter | 比 SSE 更灵活的自由格式输出 |
| 需要兼容低版本浏览器 | DeferredResult + 轮询 | 降级为传统 AJAX 轮询方案 |
通过合理选择这些异步处理对象,可以显著提升 Spring Boot 应用的吞吐量和实时响应能力,建议根据具体业务场景的特点进行技术选型。
相关文章:
Spring Boot 异步返回对象深度解析
前言 在现代高并发、高响应的应用场景中,Spring Boot 的异步处理能力是提升系统吞吐量和用户体验的关键技术之一。无论是实时数据推送、大文件传输,还是复杂异步任务调度,Spring Boot 提供了多种灵活的异步处理机制以满足不同需求。本文将从…...
【工具】C#防沉迷进程监控工具使用手册
一、软件简介 本工具用于监控指定进程的运行时长,当达到预设时间时通过声音、弹窗、窗口抖动等方式进行提醒,帮助用户合理控制程序使用时间。 软件在上篇文章。 二、系统要求 Windows 7/10/11.NET Framework 4.5 或更高版本 三、快速入门 1. 配置文件…...
【docker】--- 详解 WSL2 中的 Ubuntu 和 Docker Desktop 的区别和关系!
在编程的艺术世界里,代码和灵感需要寻找到最佳的交融点,才能打造出令人为之惊叹的作品。而在这座秋知叶i博客的殿堂里,我们将共同追寻这种完美结合,为未来的世界留下属于我们的独特印记。【WSL 】--- Windows11 迁移 WSL 超详细指南 —— 给室友换一个宿舍! 开发环境一、引…...
强大的AI网站推荐(第一集)—— Devv AI
网站:Devv AI 号称:最懂程序员的新一代 AI 搜索引擎 博主评价:我的大学所有的代码都是使用它,极大地提升了我的学习和开发效率。 推荐指数:🌟🌟🌟🌟🌟&#x…...
模块二 单元4 安装AD+DC
模块二 单元4 安装ADDC 两个任务: 1.安装AD活动目录 2.升级当前服务器为DC域控制器 安装前的准备工作: 确定你要操作的服务器系统(Windows server 2022); 之前的服务器系统默认是工作组的模式workgroup模式(…...
蓝桥杯备考:数学问题模运算---》次大值
这道题,由于数据规模是2e5,我们直接暴力的话是一定会超时的 所以我们得想个办法,我们先把所有的数排序去重 我们先想想如果要找最大值,怎么找 这时候我们要分类讨论 ①如果是大数模小数,那结果肯定是小于小数的&am…...
k8s1.30 部署calio网络
一、介绍 网路组件有很多种,只需要部署其中一个,推荐calio。 calio是一个纯三成的数据中心网络方案,calico支持广泛的平台。如k8s,openstack等。 calio在每一个计算节点利用linux内核,实现了一个高效的虚拟路由器来…...
test skills
一、测试技术 1、python GitHub - taizilongxu/interview_python: 关于Python的面试题 GitHub - JushuangQiao/Python-Offer: 《剑指Offer》面试题Python实现 GitHub - vinta/awesome-python: An opinionated list of awesome Python frameworks, libraries, software and …...
Elasticsearch:为推理端点配置分块设置
推理端点对一次可处理的文本量有限,具体取决于模型的输入容量。分块(Chunking) 是指将输入文本拆分成符合这些限制的小块的过程,在将文档摄取到 semantic_text 字段时会进行分块。分块不仅有助于保持输入文本在可处理范围内&#…...
如何使用webpack预加载 CSS 中定义的资源和预加载 CSS 文件
在 Webpack 中预加载 CSS 文件及其内部定义的资源(如图片、字体等),可以通过 资源预加载(Preloading) 技术优化关键资源的加载优先级。以下是具体的实现方法和步骤: 一、预加载 CSS 文件 1. 使用 vue/prel…...
[工控机安全] 使用DriverView快速排查不可信第三方驱动(附详细图文教程)
导语: 在工业控制领域,设备驱动程序的安全性至关重要。第三方驱动可能存在兼容性问题、安全漏洞甚至恶意代码,威胁设备稳定运行。本文将手把手教你使用 DriverView工具,高效完成工控机驱动安全检查,精准识别可疑驱动&a…...
解决 React Native 0.76 中 com.facebook.react.settings 插件缺失问题
在使用 React Native 0.76 创建项目时,遇到以下错误: FAILURE: Build failed with an exception. * Where: Settings file /Users/wangxp/learn/AwesomeProject/android/settings.gradle line: 2 * What went wrong: Plugin [id: com.facebook.react.se…...
多无人车协同探索开源包启动文件介绍(上)
在之前介绍的《多无人车协同探索开源包部署教程及常见报错解决方式》中运行多无人车协同探索时,先后运行了两个launch文件 multiple_tb3_house.launch 和three_robots.launch ,本文来进一步看一下这两个启动文件以及其调用的move_base .launch 和multi_t…...
Linux驱动学习笔记(三)
并发与竞争 1.在编写驱动程序的时候,要尽量避免让驱动程序存在并发和竞争,Linux内核里面提供了几种处理并发与竞争的方法,分别是:原子操作、自旋锁、信号量和互斥体。 原子操作:Linux的原子操作基于atomic_t数据类型…...
【QT5 多线程示例】互斥锁
互斥锁 互斥锁介绍:【C并发编程】(三)互斥锁:std::mutex。原理都一样,这里就不赘述了。 QMutex 是 Qt 框架中提供的一个互斥锁类,主要包括以下成员函数: lock():试图锁定互斥量。…...
SaaS系统的销售微服务与权限微服务边界设计
在设计SaaS系统的销售微服务与权限微服务的边界时,需要结合领域驱动设计(DDD)和微服务拆分原则,确保高内聚、低耦合。以下是结合微服务架构原则、多租户SaaS需求及权限管理场景的完整设计方案,整合了权限服务与销售服务…...
leetcode热题100道——两数之和
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。 你可以按任意顺序返回答案。 示例 1…...
C语言经典代码练习题
1.输入一个4位数:输出这个输的个位 十位 百位 千位 #include <stdio.h> int main(int argc, char const *argv[]) {int a;printf("输入一个4位数:");scanf("%d",&a);printf("个位:%d\n"…...
Git远程拉取和推送配置
Git进行远程代码拉取和推送时候提示配置user.name 和 user.email 背景:换新电脑后使用Git进行代码拉取和推送过程中,提示“Make sure you configure your “user.name” and “user.email” in git.”。这个配置针对git的正常使用仅需要配置一次…...
MySQL WHERE 子句详解
MySQL WHERE 子句详解 引言 在数据库操作中,WHERE 子句是用于筛选记录的重要工具。它允许我们在查询中指定条件,从而只选择满足特定条件的记录。本文将详细介绍 MySQL 中的 WHERE 子句,包括其语法、用法以及一些高级技巧。 WHERE 子句的基…...
基于SpringBoot+Vue3实现的宠物领养管理平台功能七
一、前言介绍: 1.1 项目摘要 随着社会经济的发展和人们生活水平的提高,越来越多的人开始关注并参与到宠物领养中。宠物已经成为许多家庭的重要成员,人们对于宠物的关爱和照顾也日益增加。然而,传统的宠物领养流程存在诸多不便&a…...
【leetcode hot 100 994】腐烂的橘子
多源广度优先搜索 所有的腐烂橘子在广度优先搜索上是等价于同一层的节点的。假设这些腐烂橘子刚开始是新鲜的,而有一个腐烂橘子(我们令其为超级源点)会在下一秒把这些橘子都变腐烂,而这个腐烂橘子刚开始在的时间是 −1,那么按照广度优先搜索…...
精挑20题:MySQL 8.0高频面试题深度解析——掌握核心知识点、新特性和优化技巧
1. MySQL 8.0 中,为什么查询缓存被移除? 答案: 原因:查询缓存对频繁更新的表效果差,任何对该表的写操作都会清空所有相关缓存,导致缓存命中率低,反而增加开销。 替代方案: 使用应用…...
调研报告:Hadoop 3.x Ozone 全景解析
Ozone 是 Hadoop 的分布式对象存储系统,具有易扩展和冗余存储的特点。 Ozone 不仅能存储数十亿个不同大小的对象,还支持在容器化环境(比如 Kubernetes)中运行。 Apache Spark、Hive 和 YARN 等应用无需任何修改即可使用 Ozone。Ozone 提供了 Java API、S3 接口和命令行接口…...
深入理解 RLP 编码与 JSON:原理、应用与比较
在区块链和数据存储领域,RLP(Recursive Length Prefix)编码和**JSON(JavaScript Object Notation)**是两种重要的数据编码方式。它们分别适用于不同的应用场景,并具有不同的优缺点。本文将系统性地分析 RLP…...
【Linux】Makefile秘籍
> 🍃 本系列为Linux的内容,如果感兴趣,欢迎订阅🚩 > 🎊个人主页:【小编的个人主页】 >小编将在这里分享学习Linux的心路历程✨和知识分享🔍 >如果本篇文章有问题,还请多多包涵&a…...
玩转物联网-4G模块如何快速将数据上传到巴法云(TCP篇)
目录 1 前言 2 环境搭建 2.1 硬件准备 2.2 软件准备 2.3 硬件连接 2.4 检查驱动 3 巴法云平台设备创建 3.1 创建账号 3.2 进入巴法云 3.3 获取联网参数 4 连接巴法云 4.1 打开配置工具读取基本信息 4.2 设置连接参数进行数据交互 4.2.1 建立TCP连接 4.2.2 订阅主题 4.2.3 发布信…...
postgresql 高版本pgsql备份在低版本pgsql中恢复失败,报错:“unsupported version”
关键字 PostgreSQL、pg_restore、版本兼容性、数据库迁移、pg_dump、备份恢复、unsupported version in file header 背景环境 系统配置 环境类型操作系统PostgreSQL版本内存工具链测试环境Windows 111616GBNavicat/PgAdmin生产环境Windows Server 2012 R2128GBPgAdmin/命令…...
html相关常用语法
html相关常用语法 HTML(HyperText Markup Language)即超文本标记语言,是用于创建网页的标准标记语言 HTML使用标记语言描述Web页面的结构 HTML元素是HTML页面的建构快 HTML元素通过标签tag来表示 HTML标签是“标题”、”段落“、”表格“等内…...
vue3+ts心得
1、Vue3核心 1、setup setup里弱化this,return可以返回函数,返回后页面也显示那个函数值 data里面是可以用this.来获取setup里的值,这个是单向的 vue3两个script标签不要觉得奇怪,一个是配置组合式api的,一个是配置组…...
