Springboot通过SSE实现实时消息返回

简介: 通过Spring Boot实现SSE,可以简单高效地将实时消息推送给客户端。虽然SSE有其限制,但对于许多实时消息推送场景而言,它提供了一种简洁而强大的解决方案。在实际开发中,根据具体需求选择合适的技术,可以提高系统的性能和用户体验。希望本文能帮助你深入理解Spring Boot中SSE的实现和应用。

Spring Boot通过SSE实现实时消息返回

Server-Sent Events(SSE)是一种从服务器向客户端推送实时消息的技术。相较于WebSocket,SSE更为简单,适用于大多数实时消息场景。本文将深入探讨如何使用Spring Boot通过SSE实现实时消息返回。

一、什么是SSE

SSE是一种允许服务器通过HTTP协议向客户端发送实时更新的技术。客户端只需发送一个简单的HTTP请求,然后保持连接打开,服务器可以在任意时间推送消息。SSE适用于实时性要求高,但双向通信需求不强的场景,如实时股票行情、新闻推送等。

二、Spring Boot中使用SSE

在Spring Boot中实现SSE相对简单,只需通过Controller返回SSE的响应流即可。

1. 创建Spring Boot项目

首先,创建一个基本的Spring Boot项目,并添加必要的依赖。

pom.xml

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

2. 编写Controller

接下来,创建一个控制器来处理SSE连接并推送实时消息。

SseController.java

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

import java.io.IOException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

@RestController
public class SseController {

    private final ExecutorService executorService = Executors.newCachedThreadPool();

    @GetMapping("/sse")
    public SseEmitter handleSse() {
        SseEmitter emitter = new SseEmitter();
        executorService.execute(() -> {
            try {
                for (int i = 0; i < 10; i++) {
                    emitter.send("Message " + i, MediaType.TEXT_PLAIN);
                    TimeUnit.SECONDS.sleep(1);
                }
                emitter.complete();
            } catch (IOException | InterruptedException e) {
                emitter.completeWithError(e);
            }
        });
        return emitter;
    }
}
​

上述代码创建了一个 /sse端点,当客户端连接到该端点时,服务器将通过SseEmitter对象每秒发送一条消息,共发送10条消息。

三、客户端实现

为了接收服务器推送的消息,客户端需要使用EventSource对象建立连接并处理接收到的消息。

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>SSE Demo</title>
</head>
<body>
    <h1>Server-Sent Events Demo</h1>
    <div id="messages"></div>

    <script>
        const eventSource = new EventSource("/sse");

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

        eventSource.onerror = function() {
            console.error("EventSource failed.");
        };
    </script>
</body>
</html>
​

在上述HTML文件中,使用 EventSource对象连接到 /sse端点,并通过 onmessage事件处理器显示接收到的消息。

四、SSE的优势与限制

优势

  1. 简单性:SSE基于HTTP协议,易于实现和维护。
  2. 自动重连:浏览器内置对SSE的支持,能够自动处理重连和断线恢复。
  3. 节省资源:SSE使用HTTP长连接,避免了轮询带来的资源浪费。

限制

  1. 单向通信:SSE仅支持服务器向客户端推送消息,不支持双向通信。
  2. 连接数限制:浏览器对每个域名的并发连接数有限制,SSE在大量客户端连接时可能受到影响。
  3. 不适合低延迟场景:对于需要超低延迟的应用场景,WebSocket可能更合适。

五、SSE与其他技术对比分析

技术 优势 劣势 适用场景
SSE 简单易用、自动重连、基于HTTP协议 单向通信、连接数限制、不适合低延迟场景 实时通知、消息推送、新闻更新
WebSocket 双向通信、低延迟 实现复杂、需处理心跳机制和重连逻辑 即时通讯、在线游戏、协作编辑
轮询 实现简单、兼容性好 资源浪费、延迟高 简单的状态检查、低频率的数据更新
长轮询 解决轮询的延迟问题 实现较复杂、仍存在资源浪费问题 需要较高频率更新,但对实时性要求不高的场景

六、总结

通过Spring Boot实现SSE,可以简单高效地将实时消息推送给客户端。虽然SSE有其限制,但对于许多实时消息推送场景而言,它提供了一种简洁而强大的解决方案。在实际开发中,根据具体需求选择合适的技术,可以提高系统的性能和用户体验。希望本文能帮助你深入理解Spring Boot中SSE的实现和应用。

目录
相关文章
|
7月前
|
前端开发 Java 调度
springboot整合SSE技术开发经验总结及心得
springboot整合SSE技术开发经验总结及心得
1176 0
|
XML 移动开发 前端开发
【SpringBoot WEB 系列】SSE 服务器发送事件详解
SSE 全称Server Sent Event,直译一下就是服务器发送事件,一般的项目开发中,用到的机会不多,可能很多小伙伴不太清楚这个东西,到底是干啥的,有啥用
2108 0
【SpringBoot WEB 系列】SSE 服务器发送事件详解
|
3月前
|
前端开发 JavaScript Java
基于Java+Springboot+Vue开发的服装商城管理系统
基于Java+Springboot+Vue开发的服装商城管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的服装商城管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
193 2
基于Java+Springboot+Vue开发的服装商城管理系统
|
2月前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 实现动态路由和菜单功能,快速搭建前后端分离的应用框架
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 实现动态路由和菜单功能,快速搭建前后端分离的应用框架。首先,确保开发环境已安装必要的工具,然后创建并配置 Spring Boot 项目,包括添加依赖和配置 Spring Security。接着,创建后端 API 和前端项目,配置动态路由和菜单。最后,运行项目并分享实践心得,包括版本兼容性、安全性、性能调优等方面。
190 1
|
1月前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个具有动态路由和菜单功能的前后端分离应用。
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个具有动态路由和菜单功能的前后端分离应用。首先,创建并配置 Spring Boot 项目,实现后端 API;然后,使用 Ant Design Pro Vue 创建前端项目,配置动态路由和菜单。通过具体案例,展示了如何快速搭建高效、易维护的项目框架。
123 62
|
14天前
|
存储 JavaScript 前端开发
基于 SpringBoot 和 Vue 开发校园点餐订餐外卖跑腿Java源码
一个非常实用的校园外卖系统,基于 SpringBoot 和 Vue 的开发。这一系统源于黑马的外卖案例项目 经过站长的进一步改进和优化,提供了更丰富的功能和更高的可用性。 这个项目的架构设计非常有趣。虽然它采用了SpringBoot和Vue的组合,但并不是一个完全分离的项目。 前端视图通过JS的方式引入了Vue和Element UI,既能利用Vue的快速开发优势,
79 13
|
22天前
|
JavaScript 安全 Java
java版药品不良反应智能监测系统源码,采用SpringBoot、Vue、MySQL技术开发
基于B/S架构,采用Java、SpringBoot、Vue、MySQL等技术自主研发的ADR智能监测系统,适用于三甲医院,支持二次开发。该系统能自动监测全院患者药物不良反应,通过移动端和PC端实时反馈,提升用药安全。系统涵盖规则管理、监测报告、系统管理三大模块,确保精准、高效地处理ADR事件。
|
1月前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个前后端分离的应用框架,实现动态路由和菜单功能
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个前后端分离的应用框架,实现动态路由和菜单功能。首先,确保开发环境已安装必要的工具,然后创建并配置 Spring Boot 项目,包括添加依赖和配置 Spring Security。接着,创建后端 API 和前端项目,配置动态路由和菜单。最后,运行项目并分享实践心得,帮助开发者提高开发效率和应用的可维护性。
102 2
|
1月前
|
JavaScript Java 项目管理
Java毕设学习 基于SpringBoot + Vue 的医院管理系统 持续给大家寻找Java毕设学习项目(附源码)
基于SpringBoot + Vue的医院管理系统,涵盖医院、患者、挂号、药物、检查、病床、排班管理和数据分析等功能。开发工具为IDEA和HBuilder X,环境需配置jdk8、Node.js14、MySQL8。文末提供源码下载链接。
|
3月前
|
前端开发 JavaScript Java
基于Java+Springboot+Vue开发的大学竞赛报名管理系统
基于Java+Springboot+Vue开发的大学竞赛报名管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的大学竞赛报名管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
239 3
基于Java+Springboot+Vue开发的大学竞赛报名管理系统