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

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 应用的吞吐量和实时响应能力,建议根据具体业务场景的特点进行技术选型。

相关文章:

  • #pandas #python#数据标注 pd.crosstab()
  • STM32U575RIT6单片机(四)
  • 嵌入式c学习七
  • 企业架构与IT方法论:现代企业的基石
  • SQLark 实战 | 如何通过对象名和 DDL 快速搜索数据库对象
  • Unity TextMeshPro中显示建筑特殊符号
  • 【NGINX代理附件上传服务配置优化】
  • java项目之基于ssm的旅游论坛(源码+文档)
  • k8s搭建kube-prometheus
  • 在 Ubuntu 中用 Docker 安装 RAGFlow
  • 相同Vlan间的通信
  • HBase启动问题排查指南:解决HMaster和HRegionServer未运行的常见错误
  • 【C语言】使用结构体实现位段
  • Redis之单线程与多线程
  • ASP.NET Core 使用 MongoDB
  • Git Flow 分支管理策略
  • LeetCode算法题(Go语言实现)_01
  • GR00T N1——英伟达开源的通用人形VLA:类似Helix的快与慢双系统,且可类似ViLLA利用海量的无标注视频做训练
  • Docker和Dify学习笔记
  • c++简单实现redis
  • 义乌至迪拜“铁海快线+中东快航”首发,物流成本降低18%
  • 墨西哥海军帆船纽约撞桥事故已致2人死亡19人受伤
  • “南昌航空一号”成功发射,赣江鄱阳湖有了专属卫星守护
  • 习近平在第三十五个全国助残日到来之际作出重要指示
  • 浙江省台州市政协原副主席林虹被“双开”
  • Offer触手可及,2025上海社会组织联合招聘专场活动正寻找发光的你