当前位置: 首页 > news >正文

Spring WebFlux SSE(服务器发送事件)的正确用法

在SpringBoot2下SSE实现是返回一个SseEmitter,然后通过SseEmitter的send方法来发送事件.

在SpringBoot3的WebFlux 下SSE实现是返回一个Flux<ServerSentEvent<?>>,但是怎么手动向客户端发送SSE事件搜遍全网也没有看到一个讲清楚的.网上的例子一般都是这样的:

  @GetMapping("/stream-sse")public Flux<ServerSentEvent<String>> streamEvents() {return Flux.interval(Duration.ofSeconds(1)).map(sequence -> {ServerSentEvent<String> serverSentEvent = ServerSentEvent.<String> builder().id(String.valueOf(sequence)).event("periodic-event").data("SSE - " + LocalTime.now().toString()).build();log.info("stream-sse: " + serverSentEvent);return serverSentEvent;}).doOnCancel(() -> log.warn("stream-sse canceled")).doOnError(e -> log.error("stream-sse error", e));}

经过半天的摸索,终于找到解决方案,原来是通过Sinks.Many<ServerSentEvent<?>>这个类的tryEmitNext方法来手动发送事件!
下面是代码例子:

  // 使用 Sinks.Many<ServerSentEvent<String>> 对应非反应式的SseEmitter@GetMapping("/stream-sse-sink")public Flux<ServerSentEvent<String>> streamSseMvc() {Sinks.Many<ServerSentEvent<String>> sink = Sinks.many().unicast().onBackpressureError();Flux<ServerSentEvent<String>> flux = sink.asFlux();Scheduler single = Schedulers.boundedElastic();single.schedule(() -> {try {for (int i = 0; i < 50; i++) {ServerSentEvent<String> serverSentEvent = ServerSentEvent.<String> builder().id(String.valueOf(i)).event("periodic-event").data("SSE - " + LocalTime.now().toString()).build();log.info("stream-sse-sink: " + serverSentEvent);if(sink.tryEmitNext(serverSentEvent).isFailure()) {log.error("sink.tryEmitNext isFailure");break;}Thread.sleep(1000);}} catch (Exception ex) {sink.tryEmitError(ex);} finally {sink.tryEmitComplete();}},3,TimeUnit.SECONDS);return flux;}

http://www.mrgr.cn/news/78259.html

相关文章:

  • 12 —— Webpack中向前端注入环境变量
  • uniapp介入极光推送教程 超级详细
  • 如何比较Python中的两个迭代器
  • Linux -日志 | 线程池 | 线程安全 | 死锁
  • 【AIGC】如何准确引导ChatGPT,实现精细化GPTs指令生成
  • 【代码pycharm】动手学深度学习v2-08 线性回归 + 基础优化算法
  • Ubuntu20.04运行DM-VIO
  • jupyter notebook的 markdown相关技巧
  • Linux下挂载硬盘并只允许特定用户访问
  • js版本之ES5特性简述【String、Function、JSON、其他】(二)
  • tongweb安全整改
  • Springboot项目搭建(5)-前端注册界面
  • 架构-微服务架构
  • 从〇开始深度学习(0)——背景知识与环境配置
  • HarmonyOs鸿蒙开发实战(21)=>组件间通信@ohos/liveeventbus
  • 模电期末笔记 (包过版)
  • 基于yolov8、yolov5的智能零售柜商品检测识别系统(含UI界面、训练好的模型、Python代码、数据集)
  • css:转换
  • 搭建私有docker仓库
  • 《网络是怎样连接的》整体的总结
  • 深度神经网络模型压缩学习笔记二:离线量化算法和工具、实现原理和细节
  • 003 STM32认识与命名规则、架构以及资料介绍——常识
  • Java学习笔记--继承的介绍,基本使用,成员变量和成员方法访问特点
  • 2024年最新版Java八股文复习
  • 【大模型】LLaMA-Factory的环境配置、微调模型与测试
  • react 前端最后阶段静态服务器启动命令