news 2026/4/23 16:09:57

SSE实时数据推送

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
SSE实时数据推送

创建SSE连接对象后可以实时的根据信息对信息进行推送。一般在系统中我们会采用Map存储用户的信息。

// 5. 创建SSE连接,设置超时时间为1小时 SseEmitter emitter = new SseEmitter(60 * 60 * 1000L); //如果创建时时间设置为0L表示改连接永不超时只能通过监听器删除或者通过用户手动删除

当通过Sse连接到客户端时可以通过不同的API确保系统的正常使用。通过在API中设置Sse的策略,自由配置当Sse出现异常时的策略。

emitter.onCompletion(() -> { emitters.remove(connectionKey); System.out.println("SSE连接完成,用户: " + userName); }); //如果连接超时则调用改内部方法 emitter.onTimeout(() -> { emitters.remove(connectionKey); System.out.println("SSE连接超时,用户: " + userName); }); //Sse连接发生异常后调用内部方法 emitter.onError((ex) -> { emitters.remove(connectionKey); System.out.println("SSE连接错误,用户: " + userName + ", 错误: " + ex.getMessage()); });

通过调用SseEmitter对象的send方法向客户端进行发送数据,调用completeWithError可以进行关闭连接。关闭连接时要进行查看Map中存储的连接是否被删除防止因为未删除而造成无效连接的资源占用。

通过sse连接循环发送不同的数据信息:

循环发送数据我们可以既可以通过创建实时调度线程池进行实现也可以通过springboot中的任务调度注解搭配SseEmitter的reconnectTime方法进行循环发送数据。

任务调度线程池:

// 启动定时任务,每30秒推送一次数据 scheduler.scheduleAtFixedRate(this::broadcastData, 0, REFRESH_INTERVAL, TimeUnit.SECONDS);

通过springboot中的任务调度搭配SseEmitter的reconnectTime方法进行循环发送数据:

@Scheduled(cron = "0/30 * * * * *")//间隔30秒发送一次数据 // 发送连接成功事件,发送成功后间隔1秒才可以再次发送 SseEmitter.event().reconnectTime(1000);
Sse连接心跳检测:

当我们创建了永久不超时的SSe连接后如果客户端并未及时关闭或长时间占用系统资源我们可以通过创建心跳检测的心跳检测任务进行移除该连接

@Scheduled(cron = "0/30 * * * * *") public void SseHeartbeatCheck() { if (emitters.size() > 0){ //记录要删除的连接 List<String> toRemove = new ArrayList<>(); long currentTime = System.currentTimeMillis(); for (Map.Entry<String, SseEmitter> entry : emitters.entrySet()) { SseEmitter emitter = entry.getValue(); try { //心跳检测包 HashMap<String, Object> heart = new HashMap<>(); heart.put("type", "heartbeat"); heart.put("timestamp", currentTime); heart.put("serverTime", new java.util.Date()); SseEmitter.SseEventBuilder heartbeat = SseEmitter.event() .name("heartbeat") .id(String.valueOf(currentTime)) .data(heart); emitter.send(heartbeat); }catch (Exception e){ //移除异常连接 toRemove.add(entry.getKey()); } } //批量移除异常连接 toRemove.stream().forEach(E -> { SseEmitter emitter = emitters.get(E); if (emitter != null) { emitter.complete(); emitters.remove(emitter); } }); } }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/17 15:41:50

YOLOv13镜像体验报告:易用性和稳定性都在线

YOLOv13镜像体验报告&#xff1a;易用性和稳定性都在线 在智能安防摄像头需要实时识别闯入者、物流分拣线每秒处理上百件包裹、农业无人机飞过果园自动统计病果数量的今天&#xff0c;目标检测已不再是实验室里的技术演示&#xff0c;而是真正嵌入产线、跑在边缘、扛住高并发的…

作者头像 李华
网站建设 2026/4/23 13:01:33

Glyph在医疗影像报告生成中的应用案例

Glyph在医疗影像报告生成中的应用案例 1. 为什么医疗影像报告需要新思路&#xff1f; 放射科医生每天要阅读大量CT、MRI和X光片&#xff0c;每份影像背后都需要一份结构清晰、术语准确、重点突出的诊断报告。但现实是&#xff1a;人工撰写耗时长、不同医生表述风格不一、年轻…

作者头像 李华
网站建设 2026/3/18 11:20:29

GPT-OSS-20B开源价值:可定制化部署实战分析

GPT-OSS-20B开源价值&#xff1a;可定制化部署实战分析 1. 为什么GPT-OSS-20B值得开发者重点关注 最近&#xff0c;OpenAI悄然释放了一个耐人寻味的信号&#xff1a;他们并未直接发布新模型&#xff0c;而是将一套轻量级、可高度定制的推理框架以开源形式推向社区——GPT-OSS…

作者头像 李华
网站建设 2026/4/23 9:48:19

手机截图能用吗?科哥镜像对输入图片的要求说明

手机截图能用吗&#xff1f;科哥镜像对输入图片的要求说明 大家好&#xff0c;我是科哥。最近不少朋友在使用「unet person image cartoon compound人像卡通化」镜像时发来截图问&#xff1a;“这张手机拍的能转吗&#xff1f;”“我截的聊天头像行不行&#xff1f;”“自拍糊…

作者头像 李华
网站建设 2026/4/23 9:46:15

为什么ONNX导出失败?cv_resnet18_ocr-detection格式问题详解

为什么ONNX导出失败&#xff1f;cv_resnet18_ocr-detection格式问题详解 1. 问题本质&#xff1a;不是模型不行&#xff0c;是导出流程卡在了“格式契约”上 你点下“导出 ONNX”按钮&#xff0c;进度条走了一半&#xff0c;突然弹出一行红色报错—— RuntimeError: Exportin…

作者头像 李华
网站建设 2026/4/23 15:36:58

GPT-OSS-20B实战教程:从镜像部署到API调用步骤详解

GPT-OSS-20B实战教程&#xff1a;从镜像部署到API调用步骤详解 1. 什么是GPT-OSS-20B&#xff1a;轻量级开源大模型的新选择 你可能已经听说过很多大模型&#xff0c;但GPT-OSS-20B有点不一样——它不是动辄上百亿参数、需要多张A100才能跑起来的“巨无霸”&#xff0c;而是一…

作者头像 李华