SpringBoot整合SSE,基于okhttp

一、引入依赖

<dependency><groupId>com.squareup.okhttp3</groupId><artifactId>okhttp</artifactId><version>4.10.0</version>
</dependency>
<dependency><groupId>com.squareup.okhttp3</groupId><artifactId>okhttp-sse</artifactId><version>4.10.0</version>
</dependency>

二、创建 SSE 客户端服务类

import okhttp3.*;
import okhttp3.sse.EventSource;
import okhttp3.sse.EventSourceListener;
import okhttp3.sse.EventSources;
import org.springframework.stereotype.Service;import java.util.concurrent.TimeUnit;@Service
public class SseClientService {private final OkHttpClient okHttpClient;private EventSource eventSource;public SseClientService() {this.okHttpClient = new OkHttpClient.Builder().connectTimeout(10, TimeUnit.SECONDS).readTimeout(0, TimeUnit.SECONDS) // 0表示不超时.writeTimeout(10, TimeUnit.SECONDS).build();}public void connectToSseServer(String url) {Request request = new Request.Builder().url(url).build();EventSource.Factory factory = EventSources.createFactory(okHttpClient);this.eventSource = factory.newEventSource(request, new EventSourceListener() {@Overridepublic void onOpen(EventSource eventSource, Response response) {System.out.println("SSE连接已建立");}@Overridepublic void onEvent(EventSource eventSource, String id, String type, String data) {System.out.printf("收到事件: id=%s, type=%s, data=%s%n", id, type, data);// 在这里处理收到的数据}@Overridepublic void onClosed(EventSource eventSource) {System.out.println("SSE连接已关闭");}@Overridepublic void onFailure(EventSource eventSource, Throwable t, Response response) {System.err.println("SSE连接失败: " + t.getMessage());// 可以在这里实现重连逻辑reconnect(url);}});}private void reconnect(String url) {try {Thread.sleep(5000); // 5秒后重连connectToSseServer(url);} catch (InterruptedException e) {Thread.currentThread().interrupt();}}public void closeConnection() {if (eventSource != null) {eventSource.cancel();}okHttpClient.dispatcher().executorService().shutdown();}
}

三、 创建控制器测试

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/sse-client")
public class SseClientController {private final SseClientService sseClientService;public SseClientController(SseClientService sseClientService) {this.sseClientService = sseClientService;}@GetMapping("/connect")public String connect() {// 连接到SSE服务器(可以是另一个Spring Boot应用的SSE端点)sseClientService.connectToSseServer("http://localhost:8080/sse-server/subscribe");return "SSE客户端已启动";}@GetMapping("/disconnect")public String disconnect() {sseClientService.closeConnection();return "SSE客户端已关闭";}
}

四、 高级功能实现

1. 自定义事件处理
// 在EventSourceListener中添加更多事件处理
@Override
public void onEvent(EventSource eventSource, String id, String type, String data) {switch (type) {case "message":handleMessageEvent(data);break;case "system-alert":handleSystemAlert(data);break;default:handleDefaultEvent(data);}
}
2. 添加认证头
public void connectToSseServerWithAuth(String url, String token) {Request request = new Request.Builder().url(url).header("Authorization", "Bearer " + token).build();// 其余代码与基础实现相同
}
3. 心跳检测
@Override
public void onEvent(EventSource eventSource, String id, String type, String data) {if ("heartbeat".equals(type)) {System.out.println("收到心跳: " + data);return;}// 处理其他事件
}

五、OkHttpConfig单独配置

import okhttp3.OkHttpClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import java.util.concurrent.TimeUnit;@Configuration
public class OkHttpConfig {@Beanpublic OkHttpClient okHttpClient() {return new OkHttpClient.Builder().connectTimeout(15, TimeUnit.SECONDS).readTimeout(0, TimeUnit.SECONDS) // 0表示不超时.writeTimeout(15, TimeUnit.SECONDS).retryOnConnectionFailure(true).build();}
}

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

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

相关文章

【哈希表】1399. 统计最大组的数目

1399. 统计最大组的数目 - 力扣&#xff08;LeetCode&#xff09; 给你一个整数 n 。请你先求出从 1 到 n 的每个整数 10 进制表示下的数位和&#xff08;每一位上的数字相加&#xff09;&#xff0c;然后把数位和相等的数字放到同一个组中。 请你统计每个组中的数字数目&…

手动实现LinkedList

前言 大家好&#xff0c;我是Maybe。最近在学习数据结构中的链表&#xff0c;自己手动实现了一个LinkedList。我想与大家分享一下。 思维导图 代码部分 package Constant;public class constant {public static final String INDEX_IS_WRONG"输入的下标不合法"; }p…

如何检查浏览器是否启用了WebGL2.0硬件加速

一:WebGL Inspector使用 打开 Chrome 或 Edge(推荐使用 Chromium 内核浏览器)。 安装插件: 👉 Spector.js on Chrome Web Store 安装完成后,在浏览器工具栏看到绿色的 S 图标 二:捕获 WebGL 渲染帧 打开你要分析的 Web3D 网站(比如 https://3dviewer.net)。 点击浏…

“时间”,在数据处理中的真身——弼马温一般『无所不能』(DeepSeek)

电子表格时间处理真理&#xff1a;数值存储最瘦身&#xff0c;真身闯关通四海。 笔记模板由python脚本于2025-04-23 22:25:59创建&#xff0c;本篇笔记适合喜欢在电子表格中探求时间格式的coder翻阅。 【学习的细节是欢悦的历程】 博客的核心价值&#xff1a;在于输出思考与经验…

AXOP39062: 25MHz轨到轨输入输出双通道运算放大器

AXOP39062是用于低压应用(1.5V~5.5V)的双通道运算放大器&#xff0c;具有轨到轨的输入输出工作范围&#xff0c;非常适合需要小尺寸、大容性负载驱动能力的低压应用。产品具有25MHz的增益带宽&#xff0c;具有优异的噪声性能和极低的失真度。 主要特性 轨到轨的输入输出范围低…

基于大模型的胃食管反流病全周期预测与诊疗方案研究

目录 一、引言 1.1 研究背景与意义 1.2 研究目的与创新点 二、胃食管反流病概述 2.1 疾病定义与分类 2.2 流行病学特征 2.3 发病机制 三、大模型技术原理与应用基础 3.1 大模型简介 3.2 适用于胃食管反流病预测的大模型类型 3.3 数据收集与预处理 四、大模型在胃食…

西门子S7-200SMART 控制Profinet闭环步进MD-4250-PN (1)电机及专栏介绍

一、前言 本系列是我继 《西门子S7-1200PLC 控制步进电机 MD-4240-PN》系列专栏后&#xff0c;新开的一篇专栏。 系列的主题围绕 S7-200SMART Profinet闭环步进(MD-4250-PN) 触摸屏的硬件&#xff0c;预计作四篇文章&#xff0c;分别为&#xff1a;专栏介绍、硬件介绍、PLC…

bedtools coverage 获取每个位置的测序深度

1.bedtools 文档 $ bedtools --version bedtools v2.31.1coverage Compute the coverage over defined intervals. Usage:bedtools coverage [OPTIONS] -a <FILE> \-b <FILE1, FILE2, ..., FILEN>(or):coverageBed [OPTIONS] -a <FILE> \-b <FILE1,…

反向代理和DDNS的区别是什么?

反向代理&#xff08;Reverse Proxy&#xff09;和动态域名解析&#xff08;DDNS&#xff0c;Dynamic Domain Name System&#xff09;是两种不同的网络技术&#xff0c;虽然它们都与外部访问内部服务相关&#xff0c;但解决的问题和应用场景完全不同。具体区别如下&#xff1a…

缩放点积注意力

Scaled Dot-Product Attention 论文地址 https://arxiv.org/pdf/1706.03762 注意力机制介绍 缩放点积注意力是Transformer模型的核心组件&#xff0c;用于计算序列中不同位置之间的关联程度。其核心思想是通过查询向量&#xff08;query&#xff09;和键向量&#xff08;key&am…

可吸收聚合物:医疗科技与绿色未来的交汇点

可吸收聚合物&#xff08;Biodegradable Polymers&#xff09;作为生物医学工程的核心材料&#xff0c;正引领一场从“金属/塑料植入物”到“智能降解材料”的范式转移。根据QYResearch&#xff08;恒州博智&#xff09;预测&#xff0c;2031年全球可吸收聚合物市场销售额将突破…

房地产项目绩效考核管理制度与绩效提升

房地产项目绩效考核管理制度的核心目的是通过合理的绩效考核机制&#xff0c;提升项目的整体运作效率&#xff0c;并鼓励项目团队成员的积极性。该制度适用于所有房地产项目部工作人员&#xff0c;涵盖了项目经理和项目成员的考核。考核的主要内容包括项目经理和项目部成员的工…

【算法笔记】动态规划基础(一):dp思想、基础线性dp

目录 前言动态规划的精髓什么叫“状态”动态规划的概念动态规划的三要素动态规划的框架无后效性dfs -> 记忆化搜索 -> dp暴力写法记忆化搜索写法记忆化搜索优化了什么&#xff1f;怎么转化成dp&#xff1f;dp写法 dp其实也是图论首先先说结论&#xff1a;状态DAG是怎样的…

pytorch 51 GroundingDINO模型导出tensorrt并使用c++进行部署,53ms一张图

本专栏博客第49篇文章分享了将 GroundingDINO模型导出onnx并使用c++进行部署,并尝试将onnx模型转换为trt模型,fp16进行推理,可以发现推理速度提升了一倍。为此对GroundingDINO的trt推理进行调研,发现 在GroundingDINO-TensorRT-and-ONNX-Inference项目中分享了模型导出onnx…

一个关于相对速度的假想的故事-6

既然已经知道了速度是不能叠加的&#xff0c;同时也知道这个叠加是怎么做到的&#xff0c;那么&#xff0c;我们实际上就知道了光速的来源&#xff0c;也就是这里的虚数单位的来源&#xff1a; 而它的来源则是&#xff0c; 但这是两个速度的比率&#xff0c;而光速则是一个速度…

深度学习激活函数与损失函数全解析:从Sigmoid到交叉熵的数学原理与实践应用

目录 前言一、sigmoid 及导数求导二、tanh 三、ReLU 四、Leaky Relu五、 Prelu六、Softmax七、ELU八、极大似然估计与交叉熵损失函数8.1 极大似然估计与交叉熵损失函数算法理论8.1.1 伯努利分布8.1.2 二项分布8.1.3 极大似然估计总结 前言 书接上文 PaddlePaddle线性回归详解…

Python内置函数---breakpoint()

用于在代码执行过程中动态设置断点&#xff0c;暂停程序并进入调试模式。 1. 基本语法与功能 breakpoint(*args, kwargs) - 参数&#xff1a;接受任意数量的位置参数和关键字参数&#xff0c;但通常无需传递&#xff08;默认调用pdb.set_trace()&#xff09;。 - 功能&#x…

从零手写 RPC-version1

一、 前置知识 1. 反射 获取字节码的三种方式 Class.forName("全类名") &#xff08;全类名&#xff0c;即包名类名&#xff09;类名.class对象.getClass() (任意对象都可调用&#xff0c;因为该方法来自Object类&#xff09; 获取成员方法 Method getMethod(St…

ARINC818协议(六)

上图中&#xff0c;红色虚线上面为我们常用的simple mode简单模式&#xff0c;下面和上面的结合在一起&#xff0c;就形成了extended mode扩展模式。 ARINC818协议 container header容器头 ancillary data辅助数据 视频流 ADVB帧映射 FHCP传输协议 R_CTRL:路由控制routing ctr…

PyCharm 链接 Podman Desktop 的 podman-machine-default Linux 虚拟环境

#工作记录 PyCharm Community 连接到Podman Desktop 的 podman-machine-default Linux 虚拟环境详细步骤 1. 准备工作 确保我们已在 Windows 系统中正确安装并启动了 Podman Desktop。 我们将通过 Podman Desktop 提供的名为 podman-machine-default 的 Fedora Linux 41 WSL…