网站首页 > 博客文章 正文
之前歪哥写过在Nextjs前端框架中使用SSE,这次我们把前后端分离,看一下SSE在服务端该怎么写,使用的框架是我们的老朋友Spring Framework。
为了照顾没有接触过SSE的小伙伴,我们先简单来了解一下它。
Server-Sent Events(SSE)是一种用于实现服务器向客户端实时推送数据的Web技术。与传统的轮询和长轮询相比,SSE提供了更高效和实时的数据推送机制。
SSE与WebSocket 作用相似,但是WebSocket更强大和灵活。因为WebSocket是全双工通道,可以双向通信;SSE 是单向通道,只能服务器向浏览器发送。
看到这里想必大家都明白了,无需多说。
下面进入正题,首先需要知道的是,Spring框架中已经内置了SSE,所以使用相当方便,无需额外引入依赖。
我们可以先定义一个类来管理SSE,示例如下
@Component
public class SseEmitterManager {
private Map<String, SseEmitter> sseEmitterMap;
@PostConstruct
public void init() {
if (sseEmitterMap == null) {
sseEmitterMap = new ConcurrentHashMap<>();
}
}
public SseEmitter sseEmitter(String clientId) {
return sseEmitterMap.getOrDefault(clientId, null);
}
public SseEmitter registerSseEmitter(String clientId, SseEmitter sseEmitter) {
return this.sseEmitterMap.putIfAbsent(clientId, sseEmitter);
}
public void removeSseEmitter(String clientId) {
if (sseEmitterMap.containsKey(clientId)) {
sseEmitterMap.get(clientId).complete();
sseEmitterMap.remove(clientId);
}
}
}
我们在这里维护一个Map来区分不同客户端的推送通道。
下一步就是定义对外的接口,如下
@GetMapping("/push")
public SseEmitter push(HttpServletResponse response) {
sseEmitterManager.registerSseEmitter("warn-info-emitter", new SseEmitter(0L));
return sseEmitterManager.sseEmitter("warn-info-emitter");
}
在这个接口里面,我们监听clientId为warn-info-emitter的SSE通道,接口的返回是一种数据流,会保持连接,每有一条新消息过来,就会向调用方吐出。我们可以使用浏览器或者postman等工具方便的调试。
最后我们在所需的业务逻辑处发送消息就行了,示例如下
public void execute(WarningAction warningAction, String warningMessage) {
SseEmitter emitter = sseEmitterManager.sseEmitter("warn-info-emitter");
if (emitter == null) {
return;
}
emitter.onCompletion(() -> log.info("connect completion"));
emitter.onError((throwable) -> log.error("connect error {}", throwable.getMessage()));
emitter.onTimeout(() -> log.error("connect timeout"));
try {
emitter.send(warningMessage);
} catch (IOException e) {
log.error("message push abnormal! please check your connection");
}
}
注意使用相同的clientId。
以上就是SSE服务端的使用,是不是特别简单呢!
猜你喜欢
- 2025-01-06 2023 年春招 100 道软件测试面试题,附答案!
- 2025-01-06 完整的企业微信 API 接口调用教程:快速调用
- 2025-01-06 工具推荐Apifox——API 文档、API 调试、API Mock、API 自动化测试
- 2025-01-06 FastAPI 鉴权解析:实现身份验证与权限控制的关键步骤
- 2025-01-06 Spring Boot 常用注解大全:每个程序员必备
- 2025-01-06 2023年值得推荐的 API 开发工具
- 2025-01-06 一招搞定外部请求,这款 HTTP 客户端框架真的很强大!
- 2025-01-06 处理 Spring Boot Actuator 未授权访问的技巧与方法
- 2025-01-06 「Python系列」python的Flask项目实战(一)
- 2025-01-06 GitHub 新项目!快速生成接口文档和模拟数据,开发联调效率杠杠滴
你 发表评论:
欢迎- 最近发表
-
- 告别频繁登录!Nuxt3 + TS + Vue3实战:双Token无感刷新方案全解析
- SpringBoot实现单点登录(SSO)的4种方案
- 随机密聊 匿名聊天室程序源码(随机匿名聊天在线)
- SpringBoot大文件上传卡死?分块切割术搞定GB级传输,速度飙升!
- Java 微服务从源码实战开始 | Gitee 项目推荐
- 轻量级埋点sdk搭建,便捷更全面(埋点sdk是什么)
- Spring Boot 实现文件秒传功能(springboot上传文件到指定文件夹)
- 项目中不用redis分布式锁,怎么防止用户重复提交?
- SpringBoot项目日志打印traceId生成
- 如何实现PC端网站扫码登录操作?(网页 扫码)
- 标签列表
-
- ifneq (61)
- 字符串长度在线 (61)
- googlecloud (64)
- flutterrun (59)
- 系统设计图 (58)
- powershellfor (73)
- messagesource (71)
- plsql64位 (73)
- promise.race (63)
- 2019cad序列号和密钥激活码 (62)
- window.performance (66)
- qt删除文件夹 (72)
- mysqlcaching_sha2_password (64)
- ubuntu升级gcc (58)
- nacos启动失败 (64)
- ssh-add (70)
- yarnnode (62)
- abstractqueuedsynchronizer (64)
- source~/.bashrc没有那个文件或目录 (65)
- springboot整合activiti工作流 (70)
- jmeter插件下载 (61)
- 抓包分析 (60)
- idea创建mavenweb项目 (65)
- qcombobox样式表 (68)
- pastemac (61)
本文暂时没有评论,来添加一个吧(●'◡'●)