news 2026/4/21 20:41:28

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/21 8:17:54

GPEN电商商品图优化案例:人物展示图高清化部署教程

GPEN电商商品图优化案例&#xff1a;人物展示图高清化部署教程 1. 为什么电商商家需要GPEN来优化人物展示图 你有没有遇到过这样的情况&#xff1a;精心拍摄的商品人物展示图&#xff0c;上传到详情页后总觉得“差点意思”&#xff1f;皮肤不够通透、细节糊成一片、背景杂乱抢…

作者头像 李华
网站建设 2026/4/21 6:31:30

Z-Image-Turbo如何批量生成?Python脚本扩展部署案例详解

Z-Image-Turbo如何批量生成&#xff1f;Python脚本扩展部署案例详解 1. 开箱即用&#xff1a;30G权重预置&#xff0c;告别下载等待 你有没有试过为跑一个文生图模型&#xff0c;光下载权重就卡在99%一整个下午&#xff1f;显存够、硬盘够、耐心不够。Z-Image-Turbo镜像直接把…

作者头像 李华
网站建设 2026/4/20 19:51:19

Z-Image-Turbo_UI界面支持中文提示词吗?实测告诉你

Z-Image-Turbo_UI界面支持中文提示词吗&#xff1f;实测告诉你 Z-Image-Turbo 是当前生成速度最快、细节表现力极强的开源文生图模型之一&#xff0c;8步即可输出10241024高清图像&#xff0c;推理延迟低至5~7秒&#xff08;RTX 3090实测&#xff09;。但很多刚上手的朋友会问…

作者头像 李华
网站建设 2026/4/18 4:55:07

Qwen3-Embedding-0.6B部署实战:基于CSDN GPU Pod的全流程操作

Qwen3-Embedding-0.6B部署实战&#xff1a;基于CSDN GPU Pod的全流程操作 1. 为什么选Qwen3-Embedding-0.6B&#xff1f;轻量、多能、开箱即用 你有没有遇到过这样的问题&#xff1a;想给自己的搜索系统加个语义理解能力&#xff0c;但发现主流嵌入模型动辄要8GB显存、推理慢…

作者头像 李华
网站建设 2026/4/18 9:53:49

小白必看:一键启动麦橘超然,快速搭建本地AI画廊

小白必看&#xff1a;一键启动麦橘超然&#xff0c;快速搭建本地AI画廊 1. 为什么你需要这个“本地AI画廊”&#xff1f; 你是不是也遇到过这些问题&#xff1a; 想试试最新AI绘画模型&#xff0c;但网页版总卡在排队、限速、要登录、还要充会员&#xff1f;下载了各种WebUI…

作者头像 李华
网站建设 2026/4/20 22:48:01

Qwen3-0.6B性能瓶颈突破:批处理与并行请求优化部署案例

Qwen3-0.6B性能瓶颈突破&#xff1a;批处理与并行请求优化部署案例 1. 为什么小模型也需要性能调优&#xff1f; 很多人以为只有7B、14B甚至更大的模型才需要关心吞吐和延迟&#xff0c;Qwen3-0.6B参数量不到10亿&#xff0c;显存占用低、单次推理快&#xff0c;是不是“开箱…

作者头像 李华