欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 财经 > 创投人物 > Springboot——SseEmitter流式输出

Springboot——SseEmitter流式输出

2024/12/2 23:20:04 来源:https://blog.csdn.net/qq_38322527/article/details/144171403  浏览:    关键词:Springboot——SseEmitter流式输出

文章目录

  • 前言
  • SseEmitter 简介
  • 测试demo
  • 注意点
    • 异常一 ResponseBodyEmitter is already set complete

前言

最近做AI类的开发,看到各大AI模型的输出方式都是采取的一种EventStream的方式实现。

不是通常的等接口处理完成后,一次性返回。
而是片段式的处理完成一个分片,就立马告知前端做出处理;后续处理出新的片段则再次发送给客户端。

Spring框架中就有一个类似的方式实现。SseEmitter

SseEmitter 简介

SseEmitter 是在Spring 4.2开始引入的,使用的话需要注意版本,不过Springboot 2.X 是可以玩的。

测试demo

编写一段代码,循环返回给客户端。如下所示:

package cn.xj.controller;import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;import java.io.IOException;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;@RestController
@RequestMapping("/sse/mitter")
public class SseMitterController {@GetMapping(value = "/stream", produces = "text/event-stream")public SseEmitter stream() {// 设置默认超时时间  0L 表示无限// 注意:这里的单位是  msSseEmitter sseEmitter = new SseEmitter(30000L);// 最好不要阻塞主线程Executors.newSingleThreadExecutor().execute(() -> {try {for (int i = 0; i < 10; i++) {sseEmitter.send("这只是一个流式输出案例:" + i);TimeUnit.SECONDS.sleep(1);}// 通知客户端消息发送完毕sseEmitter.complete();} catch (Exception e) {e.printStackTrace();sseEmitter.completeWithError(e);}});return sseEmitter;}
}

浏览器请求,打开控制台查看数据格式,如下所示:
在这里插入图片描述

注意点

异常一 ResponseBodyEmitter is already set complete

这种问题通常是 设置超时时间timeout太小导致的。网上很多demo中说的这个单位是秒,但实际测试来看,单位应该是毫秒 ms

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com