SpringMVC实现text/event-stream(SSE)

SSE简介

严格地说,HTTP 协议无法做到服务器主动推送信息。但是,有一种变通方法,就是服务器向客户端声明,接下来要发送的是流信息(streaming)。

也就是说,发送的不是一次性的数据包,而是一个数据流,会连续不断地发送过来。这时,客户端不会关闭连接,会一直等着服务器发过来的新的数据流,视频播放就是这样的例子。本质上,这种通信就是以流信息的方式,完成一次用时很长的下载。

SSE 就是利用这种机制,使用流信息向浏览器推送信息。它基于 HTTP 协议,目前除了 IE/Edge,其他浏览器都支持。

--------Server-Sent Events 教程 - 阮一峰的网络日志

服务端实现

SpringMVC支持了SSE,所以不需要引入额外的包。SpringMVC实现SSE主要借助ResponseBodyEmitter SseEmitter SseEmitter ResponseBodyEmitter 的子类。访问Asynchronous Requests :: Spring Framework查看官方对SSE实现的介绍。

java 复制代码
@RestController
public class SseSampleController {

    ExecutorService executorService = Executors.newSingleThreadExecutor();

    @GetMapping("/sse")
    @CrossOrigin()
    public SseEmitter sse() {
        SseEmitter emitter = new SseEmitter();
        emitter.onTimeout(() -> System.out.println("timeout"));
        emitter.onCompletion(() -> System.out.println("completion"));
        emitter.onError((e) -> System.out.println("error"));

        executorService.submit(() -> {
            try {
                emitter.send(SseEmitter.event().id("1").data("start"));
                for (int i = 0; i < 5; i++) {
                    emitter.send(SseEmitter.event().id("1").data(i));
                    Thread.sleep(1000);
                }
                emitter.send(SseEmitter.event().id("1").data("end"));
                emitter.complete();
            } catch (IOException | InterruptedException e) {
                emitter.completeWithError(e);
            }
        });

        return emitter;
    }
}

客户端实现

客户端主要使用js的EventSource对象。

javascript 复制代码
eventSource = new EventSource("http://localhost:8090/sse")
eventSource.onerror=()=>eventSource.close()
eventSource.onmessage=(event)=>console.log(event.data)

部署测试

SseSampleController 类已经通过@CrossOrigin注解允许跨域访问,可以在浏览器控制台上直接执行客户端代码。

相关推荐
indexsunny2 小时前
互联网大厂Java求职面试实战:Spring Boot微服务与Redis缓存场景解析
java·spring boot·redis·缓存·微服务·消息队列·电商
无心水2 小时前
【分布式利器:腾讯TSF】7、TSF高级部署策略全解析:蓝绿/灰度发布落地+Jenkins CI/CD集成(Java微服务实战)
java·人工智能·分布式·ci/cd·微服务·jenkins·腾讯tsf
28岁青春痘老男孩7 小时前
JDK8+SpringBoot2.x 升级 JDK 17 + Spring Boot 3.x
java·spring boot
方璧7 小时前
限流的算法
java·开发语言
元Y亨H7 小时前
Nacos - 服务注册
java·微服务
曲莫终8 小时前
Java VarHandle全面详解:从入门到精通
java·开发语言
一心赚狗粮的宇叔8 小时前
中级软件开发工程师2025年度总结
java·大数据·oracle·c#
奋进的芋圆8 小时前
DataSyncManager 详解与 Spring Boot 迁移指南
java·spring boot·后端
计算机程序设计小李同学8 小时前
个人数据管理系统
java·vue.js·spring boot·后端·web安全
小途软件9 小时前
用于机器人电池电量预测的Sarsa强化学习混合集成方法
java·人工智能·pytorch·python·深度学习·语言模型