当前位置: 首页 > article >正文

在Spring Boot中使用SeeEmitter类实现EventStream流式编程将实时事件推送至客户端

在这里插入图片描述

😄 19年之后由于某些原因断更了三年,23年重新扬帆起航,推出更多优质博文,希望大家多多支持~
🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志
🎐 个人CSND主页——Micro麦可乐的博客
🐥《Docker实操教程》专栏以最新的Centos版本为基础进行Docker实操教程,入门到实战
🌺《RabbitMQ》专栏主要介绍使用JAVA开发RabbitMQ的系列教程,从基础知识到项目实战
🌸《设计模式》专栏以实际的生活场景为案例进行讲解,让大家对设计模式有一个更清晰的理解
💕《Jenkins实战》专栏主要介绍Jenkins+Docker的实战教程,让你快速掌握项目CI/CD,是2024年最新的实战教程
🌞《Spring Boot》专栏主要介绍我们日常工作项目中经常应用到的功能以及技巧,代码样例完整
如果文章能够给大家带来一定的帮助!欢迎关注、评论互动~

在Spring Boot中使用SeeEmitter类实现EventStream流式编程

  • 引言
  • 什么是 Server-Sent Events(SSE)?
  • 为什么选择 SeeEmitter?
  • 开始实战
    • ❶ 添加依赖
    • ❷ 创建事件服务类
    • ❸ 创建事件控制器
    • ❹ 客户端实现
  • 运行应用
  • 总结

引言

随着现代 Web 开发对实时数据处理需求的增加,流式编程(Stream Programming)和事件驱动架构(Event-Driven Architecture)越来越受到关注。在这种架构下,服务器端持续推送实时数据到客户端是非常常见的需求。实现这一目标的技术之一是 Server-Sent Events(SSE),它是一种基于 HTTP 协议的单向通信机制,可以让服务器推送事件到浏览器或客户端。

什么是 Server-Sent Events(SSE)?

Server-Sent Events(SSE)是浏览器与服务器之间的一种通信机制,允许服务器向客户端发送事件流。与 WebSocket 不同,SSE 是单向通信,适用于需要实时更新数据的场景,如通知、新闻推送、实时数据更新等。

SSE 的工作方式是:客户端发起一个 HTTP 请求,服务器返回一个持续开放的响应流。通过这个流,服务器可以不断向客户端发送事件数据,如下图:
在这里插入图片描述

为什么选择 SeeEmitter?

SeeEmitterSpring Framework 5 引入的一个功能类,用于在响应中实现流式数据推送。与传统的 HTTP 响应不同,SeeEmitter 提供了一种方式,能够将数据持续推送到客户端。这个机制非常适合用于构建事件驱动架构,尤其是在实时消息推送、实时数据更新等场景下。

SeeEmitter 基于 Spring WebFlux支持非阻塞的事件流处理,能够处理高并发场景下的数据推送。

开始实战

这里博主将通过一个简单的示例,展示如何在 Spring Boot 中使用 SeeEmitter 实现 EventStream 流式编程,带大家进行一个简单入门

❶ 添加依赖

pom.xml 中添加 WebFlux 相关依赖,因为 SeeEmitter 是 WebFlux 的一部分。

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-webflux</artifactId>
    </dependency>
</dependencies>

❷ 创建事件服务类

在这个类中,我们将生成一个模拟的实时数据源,并通过 SeeEmitter 将数据推送给客户端。

import org.springframework.stereotype.Service;
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;

import java.util.concurrent.TimeUnit;

@Service
public class EventService {

    /**
     * 模拟一个事件流
     */
    public SseEmitter generateEventStream() {
        SseEmitter emitter = new SseEmitter();
        
        // 在独立线程中模拟推送事件
        new Thread(() -> {
            try {
                for (int i = 1; i <= 10; i++) {
                    // 每隔 2 秒发送一次事件数据
                    TimeUnit.SECONDS.sleep(2);
                    emitter.send(SseEmitter.event().name("message").data("Event #" + i));
                }
                emitter.complete();  // 完成事件推送
            } catch (Exception e) {
                emitter.completeWithError(e);  // 发生错误时,通知客户端
            }
        }).start();
        
        return emitter;
    }
}

❸ 创建事件控制器

控制器类负责处理客户端的请求,并返回 SseEmitter 事件流。每当客户端通过 HTTP 请求访问事件流时,控制器会生成一个新的事件流并持续推送数据。

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;

@RestController
public class EventController {

    private final EventService eventService;

    public EventController(EventService eventService) {
        this.eventService = eventService;
    }

    /**
     * 通过 GET 请求返回 SSE 事件流
     */
    @GetMapping("/event-stream")
    public SseEmitter streamEvents() {
        return eventService.generateEventStream();
    }
}

❹ 客户端实现

为了查看事件流的效果,你可以使用浏览器直接访问 Spring Boot 启动后的请求地址,如:http://localhost:8080/event-stream,或使用 JavaScript 实现客户端订阅事件流。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Event Stream Example</title>
    <script>
        const eventSource = new EventSource('/event-stream');

        eventSource.onmessage = function (event) {
            const message = event.data;
            const newMessage = document.createElement('div');
            newMessage.textContent = message;
            document.getElementById('messages').appendChild(newMessage);
        };

        eventSource.onerror = function (error) {
            console.error("EventSource failed:", error);
        };
    </script>
</head>
<body>
    <h1>Real-time Event Stream</h1>
    <div id="messages"></div>
</body>
</html>

运行应用

1、启动 Spring Boot 应用
2、打开浏览器,访问 http://localhost:8080/event-stream,你将看到不断推送的事件数据
3、每隔 2 秒,浏览器会显示一个新的事件,如 Event #1, Event #2 等

总结

相信大家通过博主的简单示例,你已经学会了如何在 Spring Boot 中使用 SeeEmitter 实现流式编程(EventStream)。这一机制非常适合实时数据推送、事件驱动架构以及微服务中的异步消息处理。通过 WebFlux 的非阻塞能力,SeeEmitter 能够处理高并发的流式数据传输,是构建高效、可扩展应用的有力工具。

流式编程不仅仅是响应用户请求的方式,它也能为你提供更强的可扩展性和实时性,特别是在构建实时更新、推送通知等功能时,SeeEmitter 是一个非常理想的解决方案。如果本文对您有所帮助,希望 一键三连 给博主一点点鼓励,如果您有任何疑问或建议,请随时留言讨论!
在这里插入图片描述


http://www.kler.cn/a/512061.html

相关文章:

  • iOS中的设计模式(三)- 工厂方法
  • Python文本处理:LDA主题聚类模型
  • 【Cadence tip】噪声仿真方法
  • 二叉搜索树(TreeMapTreeSet)
  • 微信消息群发(定时群发)-UI自动化产品(基于.Net平台+C#)
  • 考前64天 学习笔记 - 形成“习惯体系”进行最小启动
  • 后端架构学习笔记
  • Go语言的正则表达式
  • leetcode 221. 最大正方形
  • 提升大语言模型的三大策略
  • NLP 单双向RNN+LSTM+池化
  • 苍穹外卖 项目记录 day07 商品缓存-购物车模块开发
  • [实战]Ubuntu使用工具和命令无法ssh,但使用另一台Ubuntu机器可以用命令ssh,非root用户。
  • 『 实战项目 』Cloud Backup System - 云备份
  • Kotlin 2.1.0 入门教程(五)
  • 【useImperativeHandle Hook】通过子组件暴露相应的属性和方法,实现在父组件中访问子组件的属性和方法
  • React 中hooks之useDeferredValue用法总结
  • 深度学习 | 基于 LSTM 模型的多电池健康状态对比及预测
  • 【柱状图】——18
  • 【玩转全栈】----Django制作部门管理页面
  • 基于SpringBoot的智能家居系统的设计与实现(源码+SQL脚本+LW+部署讲解等)
  • XAMPP运行没有创建桌面图标
  • ChatGPT被曝存在爬虫漏洞,OpenAI未公开承认
  • 2025年美国大学生数学建模竞赛赛前准备计划
  • 【技术杂谈】Arcgis调用天地图和卫星影像
  • Spring Web MVC 探秘