Spring Boot 整合 SSE的高级实践(Server-Sent Events)

2025-04-25 17:50

本文主要是介绍Spring Boot 整合 SSE的高级实践(Server-Sent Events),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《SpringBoot整合SSE的高级实践(Server-SentEvents)》SSE(Server-SentEvents)是一种基于HTTP协议的单向通信机制,允许服务器向浏览器持续发送实...

1、简述

SSE(Server-Sent Events)是一种基于HTTP协议单向通信机制,允许服务器向浏览器持续发送实时更新。与WebSocket不同,SSE更简单,使用HTTP/1.1协议即可,不需要额外的协议升级。

SSE的特点:

  • 单向通信:服务器推送数据给客户端,客户端无法向服务器发送消息。
  • 简单易用:基于HTTP协议,无需复杂的配置。
  • 浏览器支持:现代浏览器大多内置支持(如Chrome、Edge、Firefox等)。

2、Spring Boot 中的SSE实现

2.1 添加依赖

SSE无需额外的依赖,Spring Boot自带对SSE的支持。创建一个Spring Boot项目即可。

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

2.2 实现后端接口

使用MediaType.TEXT_EVENT_STREAM_VALUE作为返回类型即可开启SSE。以下代码是一个简单的实现。

package com.example.sse.controller;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotaChina编程tion.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import Java.time.LocalTime;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.stream.Stream;
@RestController
public class SseController {
    @GetMapping(value = "/sse/stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
    public Stream<String> stream() {
        // 模拟数据流
        return Stream.generate(() -> "当前时间:" + LocalTime.now())
                     .limit(10); // 限制10条消息
    }
}

2.3 配置超时时间(可选)

默认情况下,Spring Boot的响应会超时。可以在application.properties中调整超时时间:

server.servlet.session.timeout=30s
spring.mvc.async.request-timeout=30000

2.4 前端实现

SSE在前端通过EventSource对象实现。以下是一个简单的前端示例:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>SSE Example</title>
</head>
<body>
    <h1>实时消息</h1>
    <div id="messages"></div>
    <script>
        const eventSource = new EventSource('/sse/stream');
        eventSource.onmessage = function(event) {
            const messagesDiv = document.getElementById('messages');
            const newMessage = document.createElement('p');
            newMessage.textContent = event.data;
            messagesDiv.appendChild(newMessage);
        };
        eventSource.onerror = function() {
            console.error('SSE连接出错,正在尝试重连...');
            eventSource.close(php);
        };
    </script>
</body>
</html>

3、高级实践

使用Spring Scheduler推送数据,在实际场景中,可能需要定时向客户端推送数据。例如php,监控系统定时更新。

package com.example.sse.service;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Service;
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
import java.io.IOException;
import java.util.concurreChina编程nt.CopyOnWriteArrayList;
@Service
public class SsePushService {
    private final CopyOnWriteArrayList<SseEmitter> emitters = new CopyOnWriteArrayList<>();
    public SseEmitter subscribe() {
        SseEmitter emitter = new SseEmitter(30_000L);
        emitters.add(emitter);
        emitter.onCompletion(() -> emitters.remove(emitter));
        emitter.onTimeout(() -> emitters.remove(emitter));
        return emitter;
    }
    public void pushMessage(String message) {
        for (SseEmitter emitter : emitters) {
            try {
                emitter.send(message, MediaType.TEXT_PLAIN);
            } catch (IOException e) {
                emitters.remove(emitter);
            }
        }
    }
}

创建一个控制器订阅和推送消息:

package com.exapythonmple.sse.controller;
import com.example.sse.service.SsePushService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class SsePushController {
    private final SsePushService ssePushService;
    public SsePushController(SsePushService ssePushService) {
        this.ssePushService = ssePushService;
    }
    @GetMapping("/sse/subscribe")
    public SseEmitter subscribe() {
        return ssePushService.subscribe();
    }
    @GetMapping("/sse/push")
    public void pushMessage() {
        ssePushService.pushMessage("当前时间:" + System.currentTimeMillis());
    }
}

注意事项:

  • 浏览器兼容性:SSE不支持IE,但现代浏览器支持良好。
  • 连接断开处理:可通过EventSourceonerror事件重新连接。
  • 性能问题:对大量订阅者时,需考虑使用分布式消息队列优化(如Kafka)。
  • 超时时间:默认30秒超时,需要根据实际需求调整。

4、适用场景

  • 实时通知:如监控系统的告警推送。
  • 实时更新:如股票行情、体育比分。
  • 消息流:如系统日志、任务进度。

到此这篇关于Spring Boot 整合 SSE(Server-Sent Events)的文章就介绍到这了,更多相关Spring Boot 整合 SSE内容请搜索China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程China编程(www.chinasem.cn)!

这篇关于Spring Boot 整合 SSE的高级实践(Server-Sent Events)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1154372

相关文章

如何在 Spring Boot 中实现 FreeMarker 模板

《如何在SpringBoot中实现FreeMarker模板》FreeMarker是一种功能强大、轻量级的模板引擎,用于在Java应用中生成动态文本输出(如HTML、XML、邮件内容等),本文... 目录什么是 FreeMarker 模板?在 Spring Boot 中实现 FreeMarker 模板1. 环

SpringMVC 通过ajax 前后端数据交互的实现方法

《SpringMVC通过ajax前后端数据交互的实现方法》:本文主要介绍SpringMVC通过ajax前后端数据交互的实现方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价... 在前端的开发过程中,经常在html页面通过AJAX进行前后端数据的交互,SpringMVC的controll

Java中的工具类命名方法

《Java中的工具类命名方法》:本文主要介绍Java中的工具类究竟如何命名,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录Java中的工具类究竟如何命名?先来几个例子几种命名方式的比较到底如何命名 ?总结Java中的工具类究竟如何命名?先来几个例子JD

Java Stream流使用案例深入详解

《JavaStream流使用案例深入详解》:本文主要介绍JavaStream流使用案例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录前言1. Lambda1.1 语法1.2 没参数只有一条语句或者多条语句1.3 一个参数只有一条语句或者多

Spring Security自定义身份认证的实现方法

《SpringSecurity自定义身份认证的实现方法》:本文主要介绍SpringSecurity自定义身份认证的实现方法,下面对SpringSecurity的这三种自定义身份认证进行详细讲解,... 目录1.内存身份认证(1)创建配置类(2)验证内存身份认证2.JDBC身份认证(1)数据准备 (2)配置依

SpringBoot整合OpenFeign的完整指南

《SpringBoot整合OpenFeign的完整指南》OpenFeign是由Netflix开发的一个声明式Web服务客户端,它使得编写HTTP客户端变得更加简单,本文为大家介绍了SpringBoot... 目录什么是OpenFeign环境准备创建 Spring Boot 项目添加依赖启用 OpenFeig

Java Spring 中 @PostConstruct 注解使用原理及常见场景

《JavaSpring中@PostConstruct注解使用原理及常见场景》在JavaSpring中,@PostConstruct注解是一个非常实用的功能,它允许开发者在Spring容器完全初... 目录一、@PostConstruct 注解概述二、@PostConstruct 注解的基本使用2.1 基本代

springboot使用Scheduling实现动态增删启停定时任务教程

《springboot使用Scheduling实现动态增删启停定时任务教程》:本文主要介绍springboot使用Scheduling实现动态增删启停定时任务教程,具有很好的参考价值,希望对大家有... 目录1、配置定时任务需要的线程池2、创建ScheduledFuture的包装类3、注册定时任务,增加、删

SpringBoot整合mybatisPlus实现批量插入并获取ID详解

《SpringBoot整合mybatisPlus实现批量插入并获取ID详解》这篇文章主要为大家详细介绍了SpringBoot如何整合mybatisPlus实现批量插入并获取ID,文中的示例代码讲解详细... 目录【1】saveBATch(一万条数据总耗时:2478ms)【2】集合方式foreach(一万条数

IntelliJ IDEA 中配置 Spring MVC 环境的详细步骤及问题解决

《IntelliJIDEA中配置SpringMVC环境的详细步骤及问题解决》:本文主要介绍IntelliJIDEA中配置SpringMVC环境的详细步骤及问题解决,本文分步骤结合实例给大... 目录步骤 1:创建 Maven Web 项目步骤 2:添加 Spring MVC 依赖1、保存后执行2、将新的依赖