SpringBoot整合SSE

目录

    • 1.SseController
    • 2. SseService
      • SseService
      • SseServiceImpl
    • 3.SendMessageTask
    • 4.将定时任务加入启动类
    • 5.参考资料

1.SseController

在这里插入图片描述

@Slf4j
@RestController
@RequestMapping("sse")
public class SseController {@Autowiredprivate SseService sseService;@RequestMapping("/")public String index(){return "sse";}/*** 创建SSE连接* @return*/@RequestMapping(path = "/connect",produces = MediaType.TEXT_EVENT_STREAM_VALUE)public SseEmitter sse(){String uuid = UUID.randomUUID().toString();log.info("新用户连接:{}",uuid);return sseService.connect(uuid);}/*** 广播消息* @param message*/@RequestMapping("/sendMessage")@ResponseBodypublic void sendMessage(@RequestBody SseMessage message){sseService.sendMessage(message);}}

2. SseService

在这里插入图片描述

SseService

public interface SseService {/*** 创建sse连接* @param uuid* @return*/SseEmitter connect(String uuid);/*** 发送消息* @param message*/void sendMessage(SseMessage message);
}

SseServiceImpl

@Slf4j
@Service
public class SseServiceImpl implements SseService {/*** sseMesageId的SseEmitter对象映射集**/private static Map<String,SseEmitter> sseEmitterMap = new ConcurrentHashMap<>();/*** 创建sse连接** @param uuid* @return*/@Overridepublic SseEmitter connect(String uuid) {SseEmitter sseEmitter = new SseEmitter();//连接成功需要返回数据,否则会出现待处理状态try{sseEmitter.send(SseEmitter.event().comment("connect success"));}catch (IOException e){e.printStackTrace();}//连接断开sseEmitter.onCompletion(()->{sseEmitterMap.remove(uuid);});//连接超时sseEmitter.onTimeout(()->{sseEmitterMap.remove(uuid);});//连接报错sseEmitter.onError((throwable)-> {sseEmitterMap.remove(uuid);});sseEmitterMap.put(uuid,sseEmitter);return sseEmitter;}/*** 发送消息** @param message*/@Overridepublic void sendMessage(SseMessage message) {message.setTotal(sseEmitterMap.size());sseEmitterMap.forEach((uuid,sseEmiter)->{try {sseEmiter.send(message, MediaType.APPLICATION_JSON);} catch (IOException e) {e.printStackTrace();}});}
}

3.SendMessageTask

在这里插入图片描述

@Configuration
public class SendMessageTask {@Autowiredprivate SseService sseService;/*** 定时执行 秒 分 时 日 月 周*/@Scheduled(cron = "*/1 * * * * *")//间隔1Spublic void sendMessageTask(){SseMessage message = new SseMessage();DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");message.setData(LocalDateTime.now().format(format));message.setDtuStatus(1);message.setPlcId(01);message.setInletValve(0);message.setSampleValve(1);message.setVentingValve(0);message.setDtuStatus(1);message.setSamplerStatus("01");sseService.sendMessage(message);}}

4.将定时任务加入启动类

在这里插入图片描述

5.参考资料

springboot集成sse详细教程: https://bilibili.com/video/BV1pC4y1P7cp

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/416509.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

近场与远场

一、近场与远场的区别 骚扰通过空间传输实质上是骚扰源的电磁能量以场的形式向四周空间传播。 场可分为近场和远场。 近场又称感应场。近场的性质与骚扰源的性质密切相关。 1、如果骚扰源是高电压&#xff0c;小电流的源&#xff0c;则近场只要是电场。如下图所示偶极子天线模…

力扣-202. 快乐数解析-弗洛伊德循环查找算法

题目链接 public static void Happy(int n) {int sum 0;int digit 0;for (int i 0; i < 20; i) {while (n ! 0) {digit n%10;sum digit*digit;n/10;}System.out.print(sum " ");n sum;sum 0;}} 使用代码测试一下每一代数字 n 2 : 4 16 37 58 89 145 42 …

web学习笔记(十六)

目录 HTML5新增标记汇总 1.新增语义化标签 2.新增音频和视频标签 2.1音频标签 audio 2.1视频标签 video 3.新增图像标签 4.新增表单元素和表单控件 5.新增应用程序标签&#xff08;使用率较低&#xff09; HTML5新增标记汇总 1.新增语义化标签 新增语义化标签能够便于…

【AJAX框架】AJAX入门与axios的使用

文章目录 前言一、AJAX是干什么的&#xff1f;二、AJAX的安装2.1 CDN引入2.2 npm安装 三、基础使用3.1 CDN方式3.2 node方式 总结 前言 在现代Web开发中&#xff0c;异步JavaScript和XML&#xff08;AJAX&#xff09;已经成为不可或缺的技术之一。AJAX使得网页能够在不刷新整个…

react native Gradle的原国外地址、本地下载、国内阿里腾讯镜像三种下载配置

一、国外地址&#xff1a;&#xff08;初始项目默认&#xff09; 下载地址&#xff1a;https://services.gradle.org/distributions/ 文件地址见下图&#xff1a; 注意&#xff1a;这个地址下载十次就有九次是连接超时&#xff0c;建议换另外两种方法 二、下载到本地&#x…

kubernetes工作负载-DamonSet

一、DemonSet的介绍 1、什么是DemonSet DaemonSet 控制器是用来保证在所有节点上运行一个 Pod 的副本当有节点加入集群时&#xff0c; 也会为他们新增一个 Pod。 当有节点从集群移除时&#xff0c;这些 Pod 也会被回收。删除 DaemonSet 将会删除它创建的所有 Pod。 简而言之…

【算法理论】期末复习-选填

算法的五个特征 1.有效性 算法必须在有限的时间能够完成&#xff0c;甚至用纸和笔完成 2.确定性 算法的每一步能够清楚的定义. 3.有限性 算法能够在有限的步骤完成 4.Input 算法有0个或者多个输入 5.Output 算法有一个或者多个输出 满足有效性&#xff0c;确定性&am…

Js-WebAPIs-事件(二)

事件监听&#xff08;绑定&#xff09; 什么是事件&#xff1f; 事件是在编程时系统内发生的动作或者发生的事情 比如用户在网页上单击一个按钮 什么是事件监听&#xff1f; 就是让程序检测是否有事件产生&#xff0c;一旦有事件触发&#xff0c;就立即调用一个函数做出响…

C 语言->编译和链接实现原理

✅作者简介&#xff1a;大家好&#xff0c;我是橘橙黄又青&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;橘橙黄又青-CSDN博客 今天学习&#xff1a;浅学编译和链接内部实现原理 前提&#xff1a;本文是在gcc编译环…

kotlin Kmp多平台模板生成

地址: Kotlin Multiplatform Wizard | JetBrains 可生成kotlin多个平台模板 https://terrakok.github.io/Compose-Multiplatform-Wizard/

go语言(八)---- map

map的声明方式有以下三种。 package mainimport "fmt"func main() {//第一种声明方式//声明map1是一个map类型&#xff0c;key是String&#xff0c;value是Stringvar myMap1 map[string] stringif myMap1 nil {fmt.Println("myMap1 是一个空map")}//在使…

如何从命令行运行testng.xml?

目录 创建一个新的java项目并从命令行运行testng.xml 使用命令行运行XML文件 从命令行运行现有maven项目的XML文件 在这篇文章中&#xff0c;我们将使用命令行运行testng.xml。有多种场景需要使用命令行工具运行testng.xml。也许您已经创建了一个maven项目&#xff0c;现在想…