轻松实现服务器事件主动推送到web端!Spring SseEmitter 详解

news/2024/9/22 14:49:05/

SseEmitter 是 Spring Framework 中用于服务器发送事件(Server-Sent Events, SSE)的类。SSE 是一种允许服务器推送更新到客户端的技术,通常用于实时更新的场景,如股票价格、实时消息、游戏状态等,又或者想要实现像ChatGPT那样的流式问答的效果。

以下是 SseEmitter 的一些关键点和使用方法:

关键点

  1. 服务器推送事件:与 WebSocket 不同,SSE 是单向通信,从服务器到客户端。客户端通过 HTTP 请求订阅事件,服务器在事件发生时推送数据。
  2. 基于 HTTP 协议SSE 使用 HTTP 协议,客户端通过标准的 HTTP 请求订阅,服务器通过 HTTP 响应推送事件。
  3. 自动重连:大多数浏览器内置对 SSE 的支持,并且会在连接断开时自动尝试重新连接。
  4. 简单性SSE 相对于 WebSocket 更加简单和轻量,适用于只需要服务器向客户端推送数据的应用场景。

使用方法

1. 添加依赖

确保你的项目中包含 Spring Web 依赖。

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
2. 创建控制器

创建一个 REST 控制器来处理 SSE 请求。

java">import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;import java.io.IOException;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;@RestController
public class SseController {@GetMapping("/sse")public SseEmitter handleSse() {SseEmitter emitter = new SseEmitter();ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();executor.scheduleAtFixedRate(() -> {try {emitter.send("Hello at " + System.currentTimeMillis());} catch (IOException e) {emitter.completeWithError(e);}}, 0, 1, TimeUnit.SECONDS);emitter.onCompletion(executor::shutdown);return emitter;}
}
3. 客户端订阅

客户端可以使用 JavaScript 原生的 EventSource 对象来订阅事件。

<!DOCTYPE html>
<html>
<head><title>SSE Example</title>
</head>
<body><h1>SSE Example</h1><div id="events"></div><script>javascript">const eventSource = new EventSource('/sse');eventSource.onmessage = function(event) {const newElement = document.createElement("div");newElement.textContent = event.data;document.getElementById("events").appendChild(newElement);};</script>
</body>
</html>

解释

  1. 创建 SseEmitter 实例:在服务器端控制器中,通过调用 new SseEmitter() 创建一个 SseEmitter 实例。
  2. 定期发送消息:使用调度任务定期向客户端发送消息。SseEmittersend 方法用于发送事件。
  3. 处理异常:在发送消息时处理可能的 IOException,并通过 completeWithError 方法通知客户端连接终止。
  4. 客户端接收消息:客户端通过 EventSource 对象订阅服务器推送的事件,并通过 onmessage 处理接收到的消息。

注意事项

  1. 连接管理:需要合理管理 SseEmitter 的生命周期,确保在连接完成、错误或超时时正确关闭。
  2. 浏览器支持SSE 是大多数现代浏览器支持的技术,但在一些老旧浏览器中可能不受支持。
  3. 数据格式SSE 传输的数据格式是文本,通常使用 JSON 格式传输结构化数据。

SseEmitter 提供了一种简洁高效的方法来实现服务器到客户端的实时数据推送,适合于许多实时应用场景。


http://www.ppmy.cn/news/1469774.html

相关文章

混淆矩阵-召回率、精确率、准确率

混淆矩阵 1 混淆矩阵2 混淆矩阵指标2.1 准确率2.2 精确率2.3 召回率2.4 特异度2.4 假正率2.5 假负率2.6 F1 分数 3 总结 1 混淆矩阵 混淆矩阵是一种用于评估分类模型性能的重要工具。它通过矩阵形式清晰地展示了模型对样本进行分类的结果&#xff0c;帮助我们理解模型在不同类…

cap原理是什么?

CAP原理&#xff0c;也被称为CAP定理或Brewer定理&#xff0c;描述了在分布式系统中&#xff0c;一致性&#xff08;Consistency&#xff09;、可用性&#xff08;Availability&#xff09;和分区容错性&#xff08;Partition tolerance&#xff09;这三个特性只能同时满足其中…

【WEB前端2024】3D智体编程:乔布斯3D纪念馆-第41课-动态添加3D对象

【WEB前端2024】3D智体编程&#xff1a;乔布斯3D纪念馆-第41课-动态添加3D对象 使用dtns.network德塔世界&#xff08;开源的智体世界引擎&#xff09;&#xff0c;策划和设计《乔布斯超大型的开源3D纪念馆》的系列教程。dtns.network是一款主要由JavaScript编写的智体世界引擎…

经验分享,如何去除文本中的空格

有时候我们需要去掉一窜文本中的空格&#xff0c;这里分享一个好用的免费网站&#xff0c;可实现在线去除 网址&#xff1a;http://www.txttool.com/t/?idMzM4 使用截图&#xff1a;

【chatbot-api开源项目】开发文档

chatbot-api 1. 需求分析1-1. 需求分析1-2. 系统流程图 2. 技术选型3. 项目开发3-1. 项目初始化3-2. 爬取接口获取问题接口回答问题接口创建对应对象 3-3. 调用AI3-4. 定时自动化回答 4. Docker部署5. 扩展5-1. 如果cookie失效了怎么处理5-2. 如何更好的对接多个回答系统 Gitee…

Floyd-Warshall

应用场景 要求出每两点之间的最短路。或判断两点之间的连通性&#xff08;两点之间是否有路径&#xff09;。 板子 代码&#xff08;必背!!!&#xff09; for(int k 1; k < n; k)for(int i 1; i < n; i)for(int j 1; j < n; j)d[i][j] min(d[i][j], d[i][k] …

ComfyUI

文章目录 一、关于 ComfyUI特点快捷键QA你为什么做这个&#xff1f;这是给谁的&#xff1f; 二、安装1、Windows直接链接下载如何在另一个UI和ComfyUI之间共享模型&#xff1f; 2、Jupyter Notebook3、手动安装&#xff08;Windows、Linux&#xff09;AMD GPU&#xff08;仅Lin…

如何将扫描的 PDF 转换为 Word

您是否正在寻找一种可靠且轻松的方式将扫描的 PDF 文档转换为可编辑的 Word 文件&#xff1f;要将 PDF 转换为可编辑的 Word 文档&#xff0c;神奇之处在于光学字符识别(OCR)。 使用 PDFgear&#xff0c;您可以无缝地将扫描的 PDF 转换为 Word&#xff0c;无论是在线还是离线。…