news 2026/4/17 20:37:58

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/15 16:39:31

640×640适合通用场景,速度快内存占用低

640640适合通用场景&#xff0c;速度快内存占用低&#xff1a;cv_resnet18_ocr-detection文字检测模型实战指南 在OCR文字检测的实际落地中&#xff0c;输入尺寸不是越大越好——它直接决定推理速度、显存/内存开销和部署灵活性。很多用户误以为“分辨率越高识别越准”&#xf…

作者头像 李华
网站建设 2026/4/18 7:33:56

unet人像卡通化色彩还原度:真实感VS卡通感平衡

UNet人像卡通化&#xff1a;真实感与卡通感的色彩还原度平衡艺术 1. 为什么色彩还原度是人像卡通化的关键分水岭 很多人第一次用卡通化工具时&#xff0c;都会被“一键变动漫”的效果惊艳到。但用多了就会发现&#xff1a;有些结果看着像画报&#xff0c;有些却像PPT&#xf…

作者头像 李华
网站建设 2026/3/11 21:56:58

部署麦橘超然后显存溢出?DiT部分float8加载优化方案

部署麦橘超然后显存溢出&#xff1f;DiT部分float8加载优化方案 1. 为什么“麦橘超然”在中低显存设备上会卡住&#xff1f; 你是不是也遇到过这种情况&#xff1a;刚兴冲冲下载完“麦橘超然”&#xff08;majicflus_v1&#xff09;模型&#xff0c;照着文档启动 WebUI&#…

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

Z-Image-Turbo从零开始教程:环境验证到自定义输出文件名实战

Z-Image-Turbo从零开始教程&#xff1a;环境验证到自定义输出文件名实战 1. 为什么选Z-Image-Turbo&#xff1f;开箱即用的文生图新体验 你有没有试过等一个模型下载半小时&#xff0c;结果显存还不足、推理卡在半路&#xff1f;Z-Image-Turbo不是又一个需要折腾环境、反复调…

作者头像 李华
网站建设 2026/4/16 21:51:34

开发者必看:3款高精度声纹模型镜像部署体验测评

开发者必看&#xff1a;3款高精度声纹模型镜像部署体验测评 1. 为什么声纹识别正在成为AI基础设施的新标配 你有没有遇到过这样的场景&#xff1a;客户在智能客服系统里反复说“我要查订单”&#xff0c;但系统始终无法准确识别说话人身份&#xff0c;导致每次都要重新验证&a…

作者头像 李华