自学内容网 自学内容网

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

在这里插入图片描述

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

引言

随着现代 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 是一个非常理想的解决方案。如果本文对您有所帮助,希望 一键三连 给博主一点点鼓励,如果您有任何疑问或建议,请随时留言讨论!
在这里插入图片描述


原文地址:https://blog.csdn.net/lhmyy521125/article/details/145267835

免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!