Spring MVC Http Event Stream

什么是 Http Event Stream

Event Stream 技术是一种实现服务器推送事件的方法,它通过在一个持续的 HTTP 连接上发送事件流来实现推送。具体来说,服务器发送一些事件到客户端,并将这些事件封装成一些指定格式的文本流。客户端通过监听这个流,就能实时收到服务器推送的事件。

text/event-stream 是一个 HTTP 响应头,用于指示服务器返回的数据是一个事件流,而不是一个普通的 HTTP 响应。事件流是一种基于事件驱动的传输协议,通常用于在微服务架构中传输实时数据。

事件流数据通常包含一组事件,这些事件可以是定时器触发的任务、网络事件、定位数据等等。事件流数据可以通过网络传输,并且可以在事件发生时立即通知相关的应用程序。

text/event-stream 响应头主要用于以下应用场景:

1. 实时监控系统:通过返回事件流数据,可以实现对系统状态、性能指标、数据采集等实时监控。事件流数据可以通过网络传输,并且可以在事件发生时立即通知相关的应用程序。

2. 事件驱动的应用程序:事件流数据通常用于事件驱动的应用程序,例如任务调度、实时数据传输、机器学习算法等。这些应用程序通常需要实时收集和处理数据,并且需要对数据进行分析和预测。

3. 高性能计算:在一些高性能计算场景中,需要处理大量的实时数据,并且需要对数据进行实时分析和预测。使用 text/event-stream 响应头可以将事件流数据作为 NIO(Non-blocking I/O)缓冲区的数据源,以提高计算效率。

4. 物联网设备:在物联网设备中,通常需要将设备状态、传感器数据等实时传输到云端或其他远程设备。使用 text/event-stream 响应头可以将事件流数据作为 MQTT(Message Queuing Telemetry Transport)或其他物联网传输协议的数据源,以便于在设备间传输数据。

总之,text/event-stream 响应头主要用于需要实时收集和处理数据,并且需要对数据进行分析和预测的场景。

Spring MVC 实践

在 Spring MVC 框架中,实现服务器端响应 Event Stream 技术,可以通过以下步骤:

  1. 定义一个控制器,该控制器将负责向客户端推送事件流。例如:

@Controller
@RequestMapping("/event-stream")
public class EventController {@GetMapping(produces = "text/event-stream")public ResponseEntity<SseEmitter> getEvents() {final SseEmitter emitter = new SseEmitter();// TODO: 填写服务器推送事件的业务逻辑return ResponseEntity.ok(emitter);}}

  1. 在控制器中,使用 produces = "text/event-stream" 注解标记该控制器能够生成数据流。在控制器的逻辑中,创建一个 SseEmitter 对象,该对象表示一个发送事件流的引用。将该对象绑定到当前请求中,并通过 ResponseEntity.ok() 方法返回 SseEmitter 对象。 或者在RestController中直接返回SseEmitter对象。
  2. 在业务逻辑中,定义服务器推送事件的具体内容,并将该事件发送到客户端。例如:

@Service
public class EventService {public void sendEvents(final SseEmitter emitter) {try {// 这里是事件发送的逻辑,可以在多个线程上执行emitter.send(SseEmitter.event().data("Event 1").comment("Comment message"));TimeUnit.SECONDS.sleep(2);emitter.send(SseEmitter.event().id("my-id").data("Event 2"));TimeUnit.SECONDS.sleep(2);emitter.send(SseEmitter.event().event("my-event").data("Event 3"));TimeUnit.SECONDS.sleep(2);emitter.send(SseEmitter.event().data("Event 4"));TimeUnit.SECONDS.sleep(2);emitter.complete(); // 发送 EOF} catch (final Exception e) {emitter.completeWithError(e);}}}

  1. 在业务逻辑中,使用 emitter.send() 方法向客户端发送事件。SseEmitter.event().data() 方法可以用来表示一个事件,其中数据部分为 data() 方法参数。SseEmitter.event().id() 和 SseEmitter.event().event() 方法分别用来表示事件的 ID 和类型。 实际项目中可以使用异步或线程池技术发送结果。
  2. 在浏览器客户端中,使用 EventSource 对象监听服务器推送的事件流。例如:

$(function() {var eventSource = new EventSource("/event-stream");var dataDiv = $('#data');eventSource.addEventListener('open', function() {console.log("connection opened");});eventSource.addEventListener('my-event', function(event) {console.log("event received: " + JSON.stringify(event));dataDiv.append(event.data);});eventSource.addEventListener('error', function() {console.log("connection error");});eventSource.addEventListener('end', function() {console.log("connection ended");});
});

在客户端中,使用 EventSource.addEventListener() 方法监听服务器端推送的事件流。'my-event' 为服务器推送事件的类型,在该例子中可以和 SseEmitter.event().event() 方法配合使用。event.data 表示事件数据的主体信息。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/74574.shtml

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

相关文章

(二十六)大数据实战——kafka集群之Kraft模式安装与部署

前言 本节内容主要介绍kafka3.0版本以后&#xff0c;一种新的kafka集群搭建模式看kraft&#xff0c;在该模式下&#xff0c;kafka高可用不在依赖于zookeeper&#xff0c;用 controller 节点代替 zookeeper&#xff0c;元数据保存在 controller 中&#xff0c;由 controller 直…

解决transform带来的z-index失效问题

现象如下&#xff1a; 其实下拉列表已经设置了z-index: 但是为什么z-index没有生效呢。 后来发现原来它的父级元素使用了transform进行垂直方向居中 网上查询了相关资料&#xff0c;说: tranform由于会构造一个新的context层, 然后这个层的z轴优先级会最低巴拉巴拉的&#xff…

【python零基础入门学习】python基础篇之文件对象open、模块以及函数的使用(三)

本站以分享各种运维经验和运维所需要的技能为主 《python》&#xff1a;python零基础入门学习 《shell》&#xff1a;shell学习 《terraform》持续更新中&#xff1a;terraform_Aws学习零基础入门到最佳实战 《k8》暂未更新 《docker学习》暂未更新 《ceph学习》ceph日常问题解…

前端八股文之“闭包”

一、定义 一句话概括闭包&#xff1a;能够访问函数内部变量的函数与这个变量的组合构成了闭包结构。如下代码 function fuc1(){let num 999return function fuc2(){console.log(num)}}fuc1()(); 如代码所示&#xff0c;fuc2和父级变量num构成了一个闭包环境。 二、应用场景…

【C++】string类模拟实现上篇(附完整源码)

目录 前言1. string的基本结构2. 构造函数、析构函数2.1 构造函数的实现2.1.1带参构造函数 2.2析构函数2.3无参构造函数2.4无参和带参构造函数合并 3. string的遍历3.1 operator[ ]3.2迭代器模拟实现 (简单实现&#xff09;3.3 const迭代器模拟实现 4. 数据的增删查改4.1 reser…

2、在Windows 10中安装和配置 PostgreSQL 15.4

一、PostgreSQL 安装前简介 PostgreSQL&#xff08;通常简称为PG SQL&#xff09;是一个强大、开源的关系型数据库管理系统&#xff08;DBMS&#xff09;&#xff0c;它具有广泛的功能和可扩展性&#xff0c;被广泛用于企业和开发项目中,PostgreSQL 具有如下一些关键特点&…

【云原生系列】Docker学习

目录 一、Docker常用命令 1 基础命令 2 镜像命令 2.1 docker images 查看本地主机的所有镜像 2.2 docker search 搜索镜像 2.3 docker pull 镜像名[:tag] 下载镜像 2.4 docker rmi 删除镜像 2.5 docker build 构建镜像 3 容器命令 3.1 如拉取一个centos镜像 3.2 运行…

SpringMVC的常用注解,参数传递以及页面跳转的使用

目录 slf4j 常用注解 RequestMapping RequestParam RequestBody PathVariable 参数传递 首先在pom.xml配置文件中导入SLF4J的依赖 基础类型String 复杂类型 RequestParam PathVariable RequestBody 增删改查 返回值 void返回值 String返回值 modelString …

51单片机的简易篮球计分器倒计时仿真设计( proteus仿真+程序+原理图+报告+讲解视频)

51单片机的简易篮球计分器倒计时仿真设计( proteus仿真程序原理图报告讲解视频&#xff09; 1.主要功能&#xff1a;2.仿真3. 程序代码4. 原理图5. 设计报告6. 设计资料内容清单&&下载链接 51单片机的简易篮球计分器倒计时仿真设计( proteus仿真程序原理图报告讲解视频…

List常见面试问题

List的特点有哪些&#xff1f; Java中的List是一种存放有序的、可以重复的数据的集合&#xff0c;它允许重复元素的存在。List中的元素都有对应的一个序列号(索引)记录着元素的位置&#xff0c;因此可以通过这个序列号来访问元素。 ‍ Java中集合有哪些&#xff1f; Java中…

最新仿闲鱼链接+独立后台管理 跳转APP

2024最新仿xy链接源码 后台一键生成链接&#xff0c;后台管理教程&#xff1a;解压源码&#xff0c;修改数据库config/Congig 不会可以看源码里有教程 下载程序&#xff1a;https://pan.baidu.com/s/16lN3gvRIZm7pqhvVMYYecQ?pwd6zw3

如何利用Socks5代理IP提升网络安全与跨境电商业务

在今天的数字时代&#xff0c;网络安全对于个人和企业来说都至关重要。随着跨境电商和在线游戏等业务的不断发展&#xff0c;保护网络安全变得尤为重要。Socks5代理IP是一项强大的工具&#xff0c;可以帮助您实现更高水平的网络安全&#xff0c;同时促进跨境电商和游戏领域的增…

【C进阶】分析 C/C++程序的内存开辟与柔性数组(内有干货)

前言&#xff1a; 本文是对于动态内存管理知识后续的补充&#xff0c;以及加深对其的理解。对于动态内存管理涉及的大部分知识在这篇文章中 ---- 【C进阶】 动态内存管理_Dream_Chaser&#xff5e;的博客-CSDN博客 本文涉及的知识内容主要在两方面&#xff1a; 简单解析C/C程序…

CSS中如何实现一个自适应正方形(宽高相等)的元素?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐利用padding百分比⭐2. 利用::before伪元素⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&#xff01;这个专栏是为那些对W…

Camunda 7.x 系列【43】事务子流程

有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot 版本 2.7.9 本系列Camunda 版本 7.19.0 源码地址:https://gitee.com/pearl-organization/camunda-study-demo 文章目录 1. 概述2. 和 ACID 的区别3. 取消和补偿事件3.1 取消结束事件3.2 取消边界事件3.3 补偿边界…

【面试心得】系统调用

这个问题也是在九识面试的时候被问到的&#xff0c;当时我说就是像Shell&#xff0c;从用户态转移到内核态的过程&#xff0c;面试官让我说的详细一点&#xff0c;我就说不出来了&#xff0c;然后我就说了一些函数调用的过程&#xff0c;hhhh。 现在在这里做一个记录吧。 本文…

车载诊断数据库——诊断问卷调查表与CDD关联关系

车载诊断数据库——诊断问卷调查表与CDD关联关系 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 没有人关注你。也无需有人关注你。你必须承认自己的价值,你不能站在他人的角度来反对自己。人生…

typeScript 学习笔记(二)

类接口 TypeScript 入门教程 (xcatliu.com) 十四.类 ① 类 类&#xff1a;定义了一件事物的抽象特点&#xff0c;包含它的属性和方法对象&#xff1a;类的实例&#xff0c;通过new生成面向对象&#xff08;OOP&#xff09;的三大特性&#xff1a;封装、继承、多态封装&…

【代表团坐车】Python 实现-附ChatGPT解析

1.题目 某组织举行会议,来了多个代表团同时到达,接待处只有一辆汽车,可以同时接待多个代表团,为了提高车辆利用率,请帮接待员计算可以坐满车的接待方案,输出方案数量。 约束: 1.一个团只能上一辆车,并且代表团人数(代表团数量小于30,每人代表团人数小于30)小于汽车容量…

LAMP搭建WordPress

L linux A apache hhtpd M mysql/maridb P PHP1、 安装php yum -y install php php-fpm php-server php-mysql1.1、 启动php-fpm并自启 systemctl enable php-fpm --now[rootecs-1cee ~]# systemctl status php-fpm ● php-fpm.service - The PHP FastCGI Process ManagerLoa…