在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流式编程
引言
随着现代 Web 开发对实时数据处理需求的增加,流式编程(Stream Programming
)和事件驱动架构(Event-Driven Architecture
)越来越受到关注。在这种架构下,服务器端持续推送实时数据到客户端是非常常见的需求。实现这一目标的技术之一是 Server-Sent Events(SSE)
,它是一种基于 HTTP 协议的单向通信机制,可以让服务器推送事件到浏览器或客户端。
什么是 Server-Sent Events(SSE)?
Server-Sent Events(SSE)
是浏览器与服务器之间的一种通信机制,允许服务器向客户端发送事件流。与 WebSocket
不同,SSE
是单向通信,适用于需要实时更新数据的场景,如通知、新闻推送、实时数据更新等。
SSE
的工作方式是:客户端发起一个 HTTP
请求,服务器返回一个持续开放的响应流。通过这个流,服务器可以不断向客户端发送事件数据,如下图:
为什么选择 SeeEmitter?
SeeEmitter
是 Spring 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)!