Skip to content

Spring Boot + SSE 打造实时消息推送

SSE(Server-Sent Events) 作为一种轻量级的实时通信协议,凭借其简单易用、单向通信的特点,成为了构建实时应用的不二之选。而 Spring Boot 作为 Java 开发领域的佼佼者,与 SSE 的结合更是如虎添翼,能够帮助我们快速构建高效、稳定的实时消息推送功能。

本文将带你深入浅出地了解 Spring Boot 如何整合 SSE,并手把手教你实现一个简单的实时消息推送应用。

SSE 简介

SSE 是一种基于 HTTP 协议的服务器推送技术,它允许服务器主动向客户端发送数据。与 WebSocket 不同,SSE 是单向通信,即服务器可以主动向客户端推送数据,而客户端只能接收数据。

  • SSE 的优势:
  1. 简单易用: SSE 基于 HTTP 协议,无需额外的协议或库,使用简单。
  2. 单向通信: 适用于服务器向客户端推送数据的场景,例如消息提醒、实时数据更新等。
  3. 自动重连: 当连接断开时,SSE 会自动尝试重新连接,保证通信的可靠性。

Spring Boot 整合 SSE

Spring Boot 提供了对 SSE 的良好支持,我们可以通过 SseEmitter 类轻松实现服务器端推送功能。

  1. 添加依赖

首先,在 pom.xml 文件中添加 Spring Boot Web 依赖:

java
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
  1. 创建控制器

创建一个控制器类,用于处理客户端请求并返回 SseEmitter 对象:

java
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

@RestController
@RequestMapping("sse")
public class SseController {

    private static final Map<String, SseEmitter> emitters = new ConcurrentHashMap<>();

    @GetMapping("subscribe/{id}")
    public SseEmitter subscribe(@PathVariable String id) {
        SseEmitter emitter = new SseEmitter();
        emitters.put(id, emitter);
        emitter.onCompletion(() -> emitters.remove(id));
        emitter.onTimeout(() -> {
            emitters.remove(id);
        });
        return emitter;
    }

    @PostMapping("push/{id}")
    public void push(@PathVariable String id,@RequestBody String message) {
        SseEmitter emitter = emitters.get(id);
        if (emitter != null) {
            try {
                emitter.send(message);
            } catch (Exception e) {
                emitter.complete();
                emitters.remove(id);
            }
        }
    }
}
  • subscribe 方法:客户端通过该接口订阅消息,返回一个 SseEmitter 对象,用于服务器端推送消息。
  • push 方法:服务器端通过该接口向指定客户端推送消息。
  • emitters:用于存储所有客户端的 SseEmitter 对象,方便管理和推送消息

测试

  1. 请求 sse/subscribe/1 接口会持续等待
  2. 王/sse/push/1 推送消息的时候,subscribe 接口就会收到响应

总结

本文介绍了如何使用 Spring Boot 整合 SSE 实现简单的实时消息推送功能。SSE 作为一种轻量级的实时通信协议,非常适合用于构建消息提醒、实时数据更新等场景。Spring Boot 提供了对 SSE 的良好支持,使得开发实时应用变得更加简单高效。

Released under the MIT License.