当前位置: 代码网 > it编程>编程语言>Java > SpringBoot整合SSE接口实现实时数据推送

SpringBoot整合SSE接口实现实时数据推送

2025年05月27日 Java 我要评论
一、什么是ssesse(server-sent events) 是一种基于http的服务器向客户端单向实时推送数据的技术。与websocket不同,sse天然支持断线重连,且协议简单,适用于股票行情、

一、什么是sse

sse(server-sent events) 是一种基于http的服务器向客户端单向实时推送数据的技术。与websocket不同,sse天然支持断线重连,且协议简单,适用于股票行情、实时日志、消息通知等场景。

二、项目环境准备

1. 基础依赖

<dependency>
    <groupid>org.springframework.boot</groupid>
    <artifactid>spring-boot-starter-web</artifactid>
</dependency>

<!-- 若使用webflux方式 -->
<dependency>
    <groupid>org.springframework.boot</groupid>
    <artifactid>spring-boot-starter-webflux</artifactid>
</dependency>

三、两种实现方式对比

特性传统servlet方式webflux响应式方式
线程模型阻塞io(线程池)非阻塞io(事件循环)
资源消耗较高较低
代码复杂度需手动管理线程声明式编程
适用场景简单低频场景高并发实时场景

四、传统servlet实现(基于sseemitter)

1. 控制器实现

@restcontroller
public class ssecontroller {

    @getmapping("/sse")
    public sseemitter handlesse() {
        sseemitter emitter = new sseemitter();
        scheduledexecutorservice executor = executors.newsinglethreadscheduledexecutor();

        runnable task = () -> {
            try {
                string data = "time: " + localdatetime.now();
                emitter.send(
                    sseemitter.event()
                        .data(data)
                        .id(string.valueof(system.currenttimemillis()))
                );
            } catch (ioexception e) {
                emitter.completewitherror(e);
                executor.shutdown();
            }
        };

        // 定时发送(立即执行,每秒一次)
        executor.scheduleatfixedrate(task, 0, 1, timeunit.seconds);

        // 客户端断开处理
        emitter.oncompletion(executor::shutdown);
        emitter.ontimeout(executor::shutdown);

        return emitter;
    }
}

2. 关键点解析

sseemitter:核心类,保持长连接

scheduledexecutorservice:定时任务线程池

事件结构:支持设置id/event/data等字段

资源释放:通过oncompletion/ontimeout确保线程池关闭

五、响应式实现(基于webflux)

1. 控制器实现

@restcontroller
public class ssewebfluxcontroller {

    @getmapping(value = "/sse-stream", 
               produces = mediatype.text_event_stream_value)
    public flux<serversentevent<string>> streamevents() {
        return flux.interval(duration.ofseconds(1))
            .map(sequence -> serversentevent.<string>builder()
                .id(string.valueof(sequence))
                .event("time-update")
                .data("sse from webflux - " + localdatetime.now())
                .build());
    }
}

2. 核心优势

非阻塞io:基于reactor库实现响应式流

自动背压:处理客户端消费速度差异

简洁api:使用flux流式编程

六、接口测试方法

1. 使用curl测试

curl http://localhost:8080/sse
curl http://localhost:8080/sse-stream

2. 前端示例

const eventsource = new eventsource('/sse');

eventsource.onmessage = (e) => {
    console.log('received:', e.data);
};

eventsource.addeventlistener('time-update', (e) => {
    console.log('custom event:', e.data);
});

七、生产环境注意事项

连接管理:设置合理的超时时间(默认30秒)

错误处理:添加onerror回调记录异常

跨域配置:需要配置cors

@configuration
public class webconfig implements webmvcconfigurer {
    @override
    public void addcorsmappings(corsregistry registry) {
        registry.addmapping("/sse*")
                .allowedorigins("*");
    }
}

性能监控:跟踪活跃连接数

八、扩展应用场景

实时股票报价推送

系统运行状态监控

聊天应用消息通知

长耗时任务进度更新

九、总结

两种实现方式各有优势:

  • 传统servlet方式 适合简单场景,快速实现
  • webflux方式 更适合高并发、低延迟需求

建议根据实际场景选择,对于新项目推荐使用webflux实现,能更好地利用系统资源。希望本文能帮助您快速上手springboot中的sse开发!

到此这篇关于springboot整合sse接口实现实时数据推送的文章就介绍到这了,更多相关springboot sse实时数据推送内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com