news 2026/3/16 20:58:22

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/3/14 13:24:06

Glyph镜像保姆级部署教程,连电脑小白都能学会

Glyph镜像保姆级部署教程&#xff0c;连电脑小白都能学会 你是不是也遇到过这样的情况&#xff1a;看到一个很酷的AI模型&#xff0c;想试试看&#xff0c;结果点开文档——满屏的命令行、配置参数、环境依赖……直接劝退&#xff1f;别担心&#xff0c;这篇教程就是为你写的。…

作者头像 李华
网站建设 2026/3/13 8:42:24

Qwen-Image-2512显存占用高?FP16量化部署实战优化

Qwen-Image-2512显存占用高&#xff1f;FP16量化部署实战优化 1. 为什么你一跑Qwen-Image-2512就卡住——真实痛点拆解 你刚下载完Qwen-Image-2512-ComfyUI镜像&#xff0c;兴冲冲地在4090D上启动&#xff0c;结果还没点下“生成”按钮&#xff0c;显存就飙到98%&#xff1b;…

作者头像 李华
网站建设 2026/3/14 11:16:32

从0开始学AI图像编辑,Qwen-Image-Edit-2511新手教程

从0开始学AI图像编辑&#xff0c;Qwen-Image-Edit-2511新手教程 你有没有过这样的时刻&#xff1a;运营突然甩来37张产品图&#xff0c;要求“把所有瓶身上的旧Slogan换成‘智感生活’&#xff0c;字体用思源黑体Medium&#xff0c;深灰#333&#xff0c;加1px浅灰描边”&#…

作者头像 李华
网站建设 2026/3/14 6:33:38

效果惊艳!用自然语言驱动手机的真实体验

效果惊艳&#xff01;用自然语言驱动手机的真实体验摘要&#xff1a;这不是科幻电影里的桥段&#xff0c;而是真实可触的日常体验。本文带你亲历 Open-AutoGLM 在真机上的完整使用过程——不依赖云端API、不上传截图、不调用黑盒服务&#xff0c;仅靠一句“打开小红书搜美食”&…

作者头像 李华
网站建设 2026/3/16 15:36:54

函数信号发生器设计:Multisim仿真电路图实战案例

以下是对您提供的博文内容进行 深度润色与结构重构后的技术文章 。本次优化严格遵循您的全部要求&#xff1a; ✅ 彻底去除AI痕迹 &#xff0c;语言自然、专业、有“人味”&#xff0c;像一位资深电子工程师在技术社区娓娓道来&#xff1b; ✅ 摒弃模板化标题与刻板逻辑…

作者头像 李华
网站建设 2026/3/15 19:20:23

cv_unet_image-matting微信技术支持怎么联系?开发者沟通渠道说明

cv_unet_image-matting微信技术支持怎么联系&#xff1f;开发者沟通渠道说明 1. 关于 cv_unet_image-matting 图像抠图 WebUI 二次开发项目 cv_unet_image-matting 是一个基于 U-Net 架构实现的轻量级图像抠图工具&#xff0c;由开发者“科哥”完成 WebUI 二次开发与工程化封…

作者头像 李华