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

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 请求。

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>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.mzph.cn/diannao/28458.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue52-scoped样式

一、scoped样式的作用 1-1、scoped样式的作用 vue中组件的样式都是汇总到一起的。容易出现一个问题&#xff1a;类名冲突。 示例&#xff1a; school和student组件的类名都叫demo&#xff0c;则student的样式将覆盖school的样式&#xff0c;因为App.vue中&#xff0c;先引入的…

Kubernetes (K8s) 和 Spring Cloud 的区别

Kubernetes (K8s) 和 Spring Cloud 是两种常用的云原生技术&#xff0c;它们在微服务架构和云计算领域中扮演着重要的角色。尽管两者都有助于开发和部署微服务&#xff0c;但它们的功能和目标存在显著差异。本文将详细讨论 Kubernetes 和 Spring Cloud 的区别&#xff0c;从它们…

NLP主流大模型如GPT3/chatGPT/T5/PaLM/LLaMA/GLM的原理和差异有哪些-详细解读

自然语言处理&#xff08;NLP&#xff09;领域的多个大型语言模型&#xff08;如GPT-3、ChatGPT、T5、PaLM、LLaMA和GLM&#xff09;在结构和功能上有显著差异。以下是对这些模型的原理和差异的深入分析&#xff1a; GPT-3 (Generative Pre-trained Transformer 3) 虽然GPT-4…

Rocky Linux安装Docker

简介&#xff1a; Red Hat Enterprise Linux (RHEL): RHEL 是由 Red Hat 公司开发和维护的企业级操作系统。 它是基于开源社区的 Fedora 项目&#xff0c;但提供了商业支持和服务&#xff0c;面向企业用户。 RHEL 提供了稳定、可靠和高性能的操作环…

理解JSP底层

import java.net.URLDecoder;public class login_jsp{//JSP的9大内置对象private JSPWriter out;//当前JSP输出流对象private HttpServletRequest request;//请求对象private HttpServletResponse response;//响应对象private HttpSession session;//会话对象private ServletCo…

【Python数据分析】Pandas_Series如何转变为DataFrame

1.使用 pd.DataFrame()构造函数 可以使用pd.DataFrame()构造函数将 Series 转换为 DataFrame。在构造函数中&#xff0c;将 Series 作为一个列传递给 DataFrame&#xff0c;并且可以通过指定列名来为 DataFrame 的列命名。 代码示例&#xff1a; import pandas as pd data[1…

sklearn 基础教程

scikit-learn&#xff08;简称sklearn&#xff09;是一个开源的机器学习库&#xff0c;它提供了简单和有效的数据分析和数据挖掘工具。sklearn是Python语言中最重要的机器学习库之一&#xff0c;广泛用于统计学习和数据分析。 以下是scikit-learn的基础教程&#xff0c;帮助您开…

【Python高级编程】用 Matplotlib 绘制迷人的图表

用 Matplotlib 绘制迷人的图表 引言 Matplotlib 是 Python 中广泛使用的绘图库&#xff0c;用于创建各种图表和可视化。本文将逐步指导您使用 Matplotlib 绘制基本图表&#xff0c;包括折线图、条形图和散点图。 安装 Matplotlib 使用 pip 安装 Matplotlib&#xff1a; pi…

存储器的性能指标以及层次化存储器

存储器的性能指标 存储器有三个性能指标&#xff1a;速度、容量和位价&#xff08;每位价格&#xff09; 1.存储速度 &#xff08;1&#xff09;存取时间 想衡量存储速度&#xff0c;最直观的指标就是完成一次存储器读写操作所需要的时间&#xff0c;这叫做存取时间&#x…

Spring运维之boo项目表现层测试加载测试的专用配置属性以及在JUnit中启动web服务器发送虚拟请求

测试表现层的代码如何测试 加载测试的专用属性 首先写一个测试 假定我们进行测试的时候要加一些属性 要去修改一些属性 我们可以写一个只在本测试有效的测试 写在配置里 测试 打印输出 我们把配置文件里面的配置注释掉后 我们同样可以启动 package com.example.demo;impo…

【数组基础知识】

二维数组 我的理解是&#xff0c;如果内层有值&#xff0c;外层打印就是地址值。如果内层没值&#xff0c;外层打印就是null。 int[][]a new int [3][]; 这样打印a[0]的时候是null。 打印a[0][0]会报错。 int[][]a new int [3][1]; 这样打印a[0]的时候是地址值。 打印a…

分布式事务之TCC

一、 实现一个分布式事务 TCC&#xff08;Try-Confirm-Cancel&#xff09;模式是一种常见的分布式事务解决方案&#xff0c;它通过将一个事务拆分为三个阶段来实现分布式事务的一致性。下面是一个使用Java语言实现TCC模式的简单案例&#xff1a; 定义业务操作接口&#xff1a…

Qt状态机框架

概述 状态机框架提供了用于创建和执行状态图的类。这些概念和符号基于Harel的Statecharts:复杂系统的可视化形式(http://www.wisdom.weizmann.ac.il/~dharel/SCANNED.PAPERS/Statecharts.pdf)&#xff0c;也是UML状态图的基础。状态机执行的语义基于状态图XML (SCXML)(http://…

Java基础知识巩固自测(上)

前言 该文章适用于已初步了解Java基础知识的入门学习者&#xff0c;便于快速回顾知识点&#xff0c;查漏补缺。 内容包括&#xff1a;Java面向对象相关知识、SQL基础语法 复习建议技巧 实用3W思维法&#xff08;What、Why、How&#xff09; 1. What&#xff08;什么&#x…

jEasyUI 树形菜单拖放控制

jEasyUI 树形菜单拖放控制 jEasyUI 是一个基于 jQuery 的框架&#xff0c;它为开发者提供了一套完整的用户界面组件。这些组件包括菜单、窗口、按钮、面板等&#xff0c;它们可以帮助开发者快速构建功能丰富且美观的网页应用程序。在本文中&#xff0c;我们将重点讨论如何使用…

mysql面试题 Day1

目录 1 可以使用mysql直接存储文件吗&#xff1f; 2 什么时候存文件&#xff0c;什么时候不存文件&#xff1f; 3 存储文件&#xff0c;有遇到什么问题吗&#xff1f; 4 emoji 乱码怎么办&#xff1f; 5 如何存储ip地址&#xff1f; 1 可以使用mysql直接存储文件吗&#xf…

Web的UI自动化基础知识

目录 1 Web自动化入门基础1.1 自动化知识以及工具1.2 主流web自动化测试工具1.3 入门案例 2 使用工具的API2.1 元素定位2.1.1 id选择器2.1.2 name2.1.3 class_name选择器2.1.4 tag_name选择器2.1.5 link_text选择器2.1.6 partial_link_text选择器2.1.7 xpath选择器2.1.8 CSS选择…

华子 Ascend C算子开发能力认证考试(初级)微认证考试答案(直接Ctrl + F搜关键词就可以了)

根据提供的文件内容&#xff0c;这里是一系列关于Ascend C编程的多选题&#xff1a; **第21题**&#xff1a; 题目&#xff1a;Ascend C的矢量编程范式把算子实现流程分为哪些基本任务。 选项&#xff1a; A. Compute B. CopyIn C. CopyOut D. Aggregate E. Split 正确答案&a…

Docker在容器启动时自动执行特定脚本

在Dockerfile中使用CMD或ENTRYPOINT执行脚本&#xff0c;以实现容器启动时执行特定脚本的目的。 示例Dockerfile&#xff1a; FROM ubuntu:20.04# 复制脚本到容器中 COPY start.sh /usr/local/bin/start.sh# 确保脚本具有可执行权限 RUN chmod x /usr/local/bin/start.sh# 使…

mediamtx流媒体服务器测试

MediaMTX简介 在web页面中直接播放rtsp视频流&#xff0c;重点推荐&#xff1a;mediamtx&#xff0c;不仅仅是rtsp-CSDN博客 mediamtx github MediaMTX(以前的rtsp-simple-server)是一个现成的和零依赖的实时媒体服务器和媒体代理&#xff0c;允许发布&#xff0c;读取&…