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

关于 SSE(Server-Sent Events)过程的简要解剖

Js前端:发送普通请求

fetch(...)
.then(()=>{})
.catch(()=>{})

Java后端:接收请求后调用请求处理函数,函数返回一个emiiter对象

public SseEmitter handleRequest(...) {// 创建一个 SseEmitter 对象,用于发送 SSE 事件SseEmitter emitter = new SseEmitter();...return emiiter;  // 将 SseEmitter 对象返回给前端,以便前端可以订阅 SSE 事件 (即:与前端建立 SSE 连接)
}

Js前端:创建一个 EventSource 对象,指定一个 GET 请求的 URL 来接收 SSE 事件

// 构建请求URL
const url = `/api/test`;// 创建一个新的 EventSource 对象,用于接受 SSE 事件
const eventSource = new EventSource(url);

Js前端:通过 EventSource 对象监听 onmessage 事件

// 当接收到新的 SSE 事件时,触发 onmessage 事件处理程序,然后在里面可以解析接收到的 JSON 数据// 监听 SSE 消息eventSource.onmessage = function (event) {try {// 解析 JSON 格式的消息const data = JSON.parse(event.data);// 根据数据处理逻辑...}} catch (e) {console.log(e);}};

Js前端:通过 EventSource 对象监听 onerror 事件

// 当发生错误时(例如网络问题或服务器关闭连接),触发 onerror 事件处理程序// 监听 SSE 错误事件eventSource.onerror = function (error) {console.log(error);eventSource.close(); // 关闭 EventSource 连接};

Java后端:发送SSE事件,将数据推送到前端(可以发送后再发送,发了再发,不用关闭连接)

// 发送 SSE 事件,将获取结果发送给前端
const message = "Hello World"
emitter.send(SseEmitter.event().data(message));

Java后端:如果不需要发送了,就关闭连接

// 调用下面方法,会发送一个特殊的 end-of-stream 字节序列通知客户端连接已关闭
emitter.complete()

Java后端:如果在处理过程中发生异常,后端可以调用 emitter.completeWithError() 方法,这会发送一个错误事件给前端,并关闭连接

emitter.completeWithError(new Exception('出错了'))

Js前端:浏览器在接收到 emitter.complete() 发送的特殊字节序列后,会自动将 EventSourcereadyState 设置为 CLOSED(值为 2),并关闭连接。

Js前端:当 EventSource 对象检测到错误时(例如网络问题、服务器关闭连接等),会触发 onerror 事件,我们可以在里面输入日志并关闭连接。通过这种方式,让前端可以有效地管理和维护 SSE 连接,确保在各种情况下都能正确处理错误并关闭连接。

// 监听 SSE 错误事件eventSource.onerror = function (error) {console.log(error);eventSource.close(); // 关闭 EventSource 连接};

相关文章:

关于 SSE(Server-Sent Events)过程的简要解剖

Js前端:发送普通请求 fetch(...) .then(()>{}) .catch(()>{})Java后端:接收请求后调用请求处理函数,函数返回一个emiiter对象 public SseEmitter handleRequest(...) {// 创建一个 SseEmitter 对象,用于发送 SSE 事件SseE…...

格恩朗管段超声波流量计:流量测量先锋

在流量测量技术不断迭代的浪潮中,格恩朗自 2019 年创立起,便以开拓者的姿态投身其中,致力于为全球用户提供先进、精准的流量测量解决方案。其旗下的管段超声波流量计,一经推出,便迅速吸引了行业的目光,成为…...

重构开发范式!飞算JavaAI革新Spring Cloud分布式系统开发

分布式系统凭借高可用性、可扩展性等核心优势,成为大型软件项目的标配架构。Spring Cloud作为Java生态最主流的分布式开发框架,虽被广泛应用于微服务架构搭建,但其传统开发模式却面临效率瓶颈——从服务注册中心配置到网关路由规则编写&#…...

图论 判断是否有环

前言:有点忘记是怎么判断一个图中是否是有环 如果是一个无向图,其实可以直接dfs,加上一个vis数组来一起判断 如果是有向图呢, class Solution:def canFinish(self, numCourses: int, prerequisites: List[List[int]]) -> bool…...

(请关注)Oracle性能调优、优化总结调优参考直接应用,性能提升实用案例

Oracle性能调优涉及SQL优化、索引设计、参数配置、存储优化等多个方面。以下是一些常见的性能调优方法及示例,涵盖核心场景和最佳实践。 1. SQL优化 示例1:使用绑定变量减少硬解析 ```sql -- 错误示例(硬解析频繁) SELECT * FROM employees WHERE employee_id = 100; …...

EasyDarwin的配置与使用

一.语言配置 准备go语言 All releases - The Go Programming Language 增加系统环境变量 让其生效 二.项目配置 Clone项目并解压 git clone https://github.com/EasyDarwin/EasyDarwin.git cd EasyDarwin go mod tidy 紧接着 make build/linux cd build cd EasyDarwin-lin-&qu…...

PostgreSQL日志管理完整方案(AI)

一、日志系统配置 1.1 核心参数配置 在postgresql.conf中进行以下设置: 启用日志收集:logging_collector on日志存储路径:log_directory ‘/var/log/postgresql’日志命名规则:log_filename ‘postgresql-%a.log’&#xff…...

【Android】基于SurfaceControlViewHost实现跨进程渲染

1 前言 本文将介绍基于 SurfaceControlViewHost 实现跨进程渲染普通 View 和 GlSurfaceView,力求用最简单的 Demo,介绍 SurfaceControlViewHost 的应用,方便读者轻松扣出核心代码应用到自己的业务中。 核心代码片段如下。 1)服务端…...

vue+ThreeJs 创造自动选择的甜甜圈(圆环)

嗨,我是小路。今天主要和大家分享的主题是“vueThreeJs 创造自动选择的甜甜圈”。 一个漂浮在页面中央的 3D 圆环,多个图标/文本/图片均匀分布在圆周上。它会自动缓慢旋转,形成动态视觉焦点。这就是今天要搭建的项目,并对…...

能说一下JVM的内存区域吗

根据Java虚拟机的规范,JVM的内存区域可以细分为程序计数器、虚拟机栈、本地方法栈、堆和方法区。 其中方法区和线程是共享的,虚拟机栈、本地方法区和程序计数器是线程私有的。 介绍一下程序计数器? 程序计数器也被称为PC寄存器。是一块较小…...

东方仙盟_灵颜妙手——表单样式——仙盟创梦IDE

代码 .东方仙盟_灵颜妙手 {background-color: #f0f8ff;padding: 10px;display: block;width:100%;height: 100%;}.东方仙盟_灵颜妙手 .表单 {max-width: 800px;margin: 0 auto;background-color: white;border-radius: 8px;box-shadow: 0 0 10px rgba(0, 123, 255, 0.1);paddin…...

输入一串字符,统计其中字母的个数

#include <stdio.h> int main() { char ch; int count 0; printf("请输入一串字符&#xff1a;\n"); while ((ch getchar())! \n) { if ((ch > a && ch < z) || (ch > A && ch < Z)) { count; } } printf("字母的个数为&a…...

进程IO之 进程

一、进程相关概念 1.什么是进程 程序&#xff1a;静态的&#xff0c;编译好的可执行文件&#xff0c;存放在磁盘中的指令和数据的集合 进程&#xff1a;动态的&#xff0c;是程序的一次执行过程&#xff0c;是独立的可调度的任务 2.进程的特点 &#xff08;1&#xff09;对…...

OpenGL Chan视频学习-5 Vertex Attributes and Layouts in OpenGL

bilibili视频链接&#xff1a; 【最好的OpenGL教程之一】https://www.bilibili.com/video/BV1MJ411u7Bc?p5&vd_source44b77bde056381262ee55e448b9b1973 一、知识点整理 1.1.OpenGL管线工作流程 为显卡提供绘制的所有数据&#xff0c;并将数据存储在GPU内存使用着色器&…...

ESP32学习笔记_Peripherals(3)——ADC

摘要 本博客介绍了ESP32-S3芯片内置SAR ADC的原理、参考电压、分辨率、信号衰减等基础知识&#xff0c;并讲解了如何使用ESP-IDF驱动库实现ADC的连续采样&#xff08;DMA&#xff09;功能&#xff0c;演示了多通道模拟信号&#xff08;如摇杆模块&#xff09;的采集与处理流程…...

QT学习一

对于选择qmake还是cmake&#xff0c;现在写的暂时先用qmake 1.命名规范和快捷键 2.按钮控件常用API //创建第一个按钮QPushButton * btn new QPushButton;//让btn对象 依赖在mywidget窗口中btn->setParent(this);//显示文本btn->setText("第一个按钮");//创建…...

黑马点评Reids重点详解(Reids使用重点)

目录 一、短信登录&#xff08;redisseesion&#xff09; 基于Session实现登录流程 &#x1f504; 图中关键模块解释&#xff1a; 利用seesion登录的问题 设计key的具体细节 整体访问流程 二、商户查询缓存 reids与数据库主动更新的三种方案 缓存穿透 缓存雪崩问题及…...

小米2025年校招笔试真题手撕(一)

一、题目 小A每天都要吃a,b两种面包各一个。而他有n个不同的面包机&#xff0c;不同面包机制作面包的时间各不相同。第i台面包机制作a面包 需要花费ai的时间&#xff0c;制作b面包则需要花费bi的时间。 为能尽快吃到这两种面包&#xff0c;小A可以选择两个不同的面包机x&…...

《软件工程》第 11 章 - 结构化软件开发

结构化软件开发是一种传统且经典的软件开发方法&#xff0c;它强调将软件系统分解为多个独立的模块&#xff0c;通过数据流和控制流来描述系统的行为。本章将结合 Java 代码示例、可视化图表&#xff0c;深入讲解面向数据流的分析与设计方法以及实时系统设计的相关内容。 11.1 …...

MongoDB基础知识(浅显)

一、MongoDB 核心概念 MongoDB 是一个 面向文档的 NoSQL 数据库&#xff0c;与传统的关系型数据库&#xff08;如 MySQL&#xff09;相比&#xff0c;最大的区别是它以 文档&#xff08;Document&#xff09;为存储单元&#xff0c;而不是表和行。 1. 数据库&#xff08;Data…...

Neo4j(三) - 使用Java操作Neo4j详解

文章目录 前言一、创建项目二、导入依赖三、节点和关系数据打印四、创建节点与关系五、查询数据方法六、更新数据方法七、删除节点与关系方法八、合并数据方法九、完整代码1. 完整代码2. 项目下载 前言 本文介绍通过 Java 操作 Neo4j 图数据库的完整流程。主要涵盖开发环境搭建…...

MPI实现大数据Ring Broadcast逻辑

文章目录 MPI实现大数据Ring Broadcast逻辑Ring Broadcast基本原理MPI实现代码优化建议性能考虑 MPI实现大数据Ring Broadcast逻辑 Ring Broadcast是一种在并行计算中高效传播大数据的技术&#xff0c;特别适合在MPI环境中使用。下面我将介绍如何用MPI实现这种广播逻辑。 Rin…...

蓝桥杯3503 更小的数

问题描述 小蓝有一个长度均为 n 且仅由数字字符 0∼9 组成的字符串&#xff0c;下标从 0 到 n−1&#xff0c;你可以将其视作是一个具有 n 位的十进制数字 num&#xff0c;小蓝可以从 num 中选出一段连续的子串并将子串进行反转&#xff0c;最多反转一次。 小蓝想要将选出的子…...

高并发下使用防重表做防重案例

工作中遇到的重复数据产生的问题&#xff1a; 之前提供的一个批量复制商品的接口&#xff0c;产生了重复的商品数据。 针对于这个问题我想到了可以加一张防重表&#xff0c;在防重表中增加商品表的name和model字段作为唯一索引。 例如&#xff1a; CREATE TABLE product_uniq…...

算法-全排列

1、全排列函数的使用 举例&#xff1a;{1,2,3}的全排列 #include<iostream> #include<bits/stdc.h> using namespace std; typedef long long ll; int main(){ll a[3] {1, 2, 3};do{for (ll i 0; i < 3;i){cout << a[i] << " ";}cout…...

最好用的wordpress外贸主题

产品展示独立站wordpress主题 橙色的首页大banner外贸英文wordpress主题&#xff0c;适合用于产品展示型的外贸网站。 https://www.jianzhanpress.com/?p8556 Machine机器wordpress模板 宽屏简洁实用的wordpress外贸建站模板&#xff0c;适合工业机器生产、加工、制造的外贸…...

2025 河北ICPC( D. 金泰园(二分)-- C.年少的誓约(公式转化))

文章目录 2025 河北ICPCD. 金泰园&#xff08;二分&#xff09;C.年少的誓约(公式转化)总结 2025 河北ICPC 题目链接&#xff1a; Attachments - The 9th Hebei Collegiate Programming Contest - Codeforces sdccpc20250522 - Virtual Judge 赛时&#xff1a;5道 D. 金泰…...

mongodb语法$vlookup性能分析

1 场景描述 mongodb有两个表department和user表&#xff0c; department表有_id,name,level&#xff0c;表有记录169w条 user表有_id,name,department_id&#xff0c;表有记录169w条&#xff0c;department_id没有创建索引&#xff0c;department_id是department的_id。 现…...

晶圆隐裂检测提高半导体行业效率

半导体行业是现代制造业的核心基石&#xff0c;被誉为“工业的粮食”&#xff0c;而晶圆是半导体制造的核心基板&#xff0c;其质量直接决定芯片的性能、良率和可靠性。晶圆隐裂检测是保障半导体良率和可靠性的关键环节。 晶圆检测 通过合理搭配工业相机与光学系统&#xff0c…...

临床试验中的独立数据监查委员会

1. IDMC会议概况 1.1 核心职责 1.1.1 安全性监查 IDMC需评估不良事件(AE)和严重不良事件(SAE),确保受试者风险可控。这是其核心职责之一,通过严格的安全性监查,保障受试者的健康和安全,避免因试验带来的不可控风险。 1.1.2 有效性评估 在预先设定的期中分析中,IDMC要…...