From 1f63373ecdf98c5ca8c2c07dcbf16a97ec02e64f Mon Sep 17 00:00:00 2001 From: wangrunpu <2095588299@qq.com> Date: Fri, 12 Dec 2025 10:13:26 +0800 Subject: [PATCH] =?UTF-8?q?fix=EF=BC=9A=E5=AE=8C=E5=96=84sse=EF=BC=8C?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BA=8B=E4=BB=B6=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/sse/core/SseEmitterManager.java | 20 +++++++++++-------- .../dromara/common/sse/dto/SseMessageDto.java | 5 +++++ .../dromara/common/sse/enums/SseEnums.java | 17 ++++++++++++++++ .../common/sse/listener/SseTopicListener.java | 6 +++--- .../common/sse/utils/SseMessageUtils.java | 12 +++++------ .../system/SysNoticeController.java | 2 +- 6 files changed, 44 insertions(+), 18 deletions(-) create mode 100644 ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/enums/SseEnums.java diff --git a/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/core/SseEmitterManager.java b/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/core/SseEmitterManager.java index b80e56169..2eebc4c8a 100644 --- a/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/core/SseEmitterManager.java +++ b/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/core/SseEmitterManager.java @@ -4,8 +4,10 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.map.MapUtil; import lombok.extern.slf4j.Slf4j; import org.dromara.common.core.utils.SpringUtils; +import org.dromara.common.core.utils.StringUtils; import org.dromara.common.redis.utils.RedisUtils; import org.dromara.common.sse.dto.SseMessageDto; +import org.dromara.common.sse.enums.SseEnums; import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; import java.io.IOException; @@ -169,13 +171,13 @@ public class SseEmitterManager { * @param userId 要发送消息的用户id * @param message 要发送的消息内容 */ - public void sendMessage(Long userId, String message) { + public void sendMessage(Long userId, String event, String message) { Map emitters = USER_TOKEN_EMITTERS.get(userId); if (MapUtil.isNotEmpty(emitters)) { for (Map.Entry entry : emitters.entrySet()) { try { entry.getValue().send(SseEmitter.event() - .name("message") + .name(StringUtils.isEmpty(event)? SseEnums.Event.MESSAGE.getEvent() :event) .data(message)); } catch (Exception e) { SseEmitter remove = emitters.remove(entry.getKey()); @@ -194,9 +196,9 @@ public class SseEmitterManager { * * @param message 要发送的消息内容 */ - public void sendMessage(String message) { + public void sendMessage(String event, String message) { for (Long userId : USER_TOKEN_EMITTERS.keySet()) { - sendMessage(userId, message); + sendMessage(userId, event, message); } } @@ -209,9 +211,10 @@ public class SseEmitterManager { SseMessageDto broadcastMessage = new SseMessageDto(); broadcastMessage.setMessage(sseMessageDto.getMessage()); broadcastMessage.setUserIds(sseMessageDto.getUserIds()); + broadcastMessage.setEvent(sseMessageDto.getEvent()); RedisUtils.publish(SSE_TOPIC, broadcastMessage, consumer -> { - log.info("SSE发送主题订阅消息topic:{} session keys:{} message:{}", - SSE_TOPIC, sseMessageDto.getUserIds(), sseMessageDto.getMessage()); + log.info("SSE发送主题订阅消息topic:{} session keys:{} event:{} message:{}", + SSE_TOPIC, sseMessageDto.getUserIds(), sseMessageDto.getEvent(), sseMessageDto.getMessage()); }); } @@ -220,11 +223,12 @@ public class SseEmitterManager { * * @param message 要发布的消息内容 */ - public void publishAll(String message) { + public void publishAll(String event, String message) { SseMessageDto broadcastMessage = new SseMessageDto(); + broadcastMessage.setEvent(event); broadcastMessage.setMessage(message); RedisUtils.publish(SSE_TOPIC, broadcastMessage, consumer -> { - log.info("SSE发送主题订阅消息topic:{} message:{}", SSE_TOPIC, message); + log.info("SSE发送主题订阅消息topic:{} event:{} message:{}", SSE_TOPIC, event, message); }); } } diff --git a/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/dto/SseMessageDto.java b/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/dto/SseMessageDto.java index a2e1210c6..31e8ff064 100644 --- a/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/dto/SseMessageDto.java +++ b/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/dto/SseMessageDto.java @@ -22,6 +22,11 @@ public class SseMessageDto implements Serializable { */ private List userIds; + /** + * 需要推送的事件 + */ + private String event; + /** * 需要发送的消息 */ diff --git a/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/enums/SseEnums.java b/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/enums/SseEnums.java new file mode 100644 index 000000000..0c71cc7fd --- /dev/null +++ b/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/enums/SseEnums.java @@ -0,0 +1,17 @@ +package org.dromara.common.sse.enums; + +import lombok.Getter; + +public class SseEnums { + + @Getter + public enum Event { + MESSAGE("message"), + HAZARD("hazard"); + + private String event; + Event(String event) { + this.event = event; + } + } +} diff --git a/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/listener/SseTopicListener.java b/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/listener/SseTopicListener.java index 7a4dff13e..428277a35 100644 --- a/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/listener/SseTopicListener.java +++ b/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/listener/SseTopicListener.java @@ -28,14 +28,14 @@ public class SseTopicListener implements ApplicationRunner, Ordered { @Override public void run(ApplicationArguments args) throws Exception { sseEmitterManager.subscribeMessage((message) -> { - log.info("SSE主题订阅收到消息session keys={} message={}", message.getUserIds(), message.getMessage()); + log.info("SSE主题订阅收到消息session keys={} event={} message={}", message.getUserIds(), message.getEvent(), message.getMessage()); // 如果key不为空就按照key发消息 如果为空就群发 if (CollUtil.isNotEmpty(message.getUserIds())) { message.getUserIds().forEach(key -> { - sseEmitterManager.sendMessage(key, message.getMessage()); + sseEmitterManager.sendMessage(key, message.getEvent(), message.getMessage()); }); } else { - sseEmitterManager.sendMessage(message.getMessage()); + sseEmitterManager.sendMessage(message.getEvent(), message.getMessage()); } }); log.info("初始化SSE主题订阅监听器成功"); diff --git a/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/utils/SseMessageUtils.java b/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/utils/SseMessageUtils.java index ce3aad472..376a4ae09 100644 --- a/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/utils/SseMessageUtils.java +++ b/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/utils/SseMessageUtils.java @@ -31,11 +31,11 @@ public class SseMessageUtils { * @param userId 要发送消息的用户id * @param message 要发送的消息内容 */ - public static void sendMessage(Long userId, String message) { + public static void sendMessage(Long userId, String event, String message) { if (!isEnable()) { return; } - MANAGER.sendMessage(userId, message); + MANAGER.sendMessage(userId, event, message); } /** @@ -43,11 +43,11 @@ public class SseMessageUtils { * * @param message 要发送的消息内容 */ - public static void sendMessage(String message) { + public static void sendMessage(String event, String message) { if (!isEnable()) { return; } - MANAGER.sendMessage(message); + MANAGER.sendMessage(event, message); } /** @@ -67,11 +67,11 @@ public class SseMessageUtils { * * @param message 要发布的消息内容 */ - public static void publishAll(String message) { + public static void publishAll(String event, String message) { if (!isEnable()) { return; } - MANAGER.publishAll(message); + MANAGER.publishAll(event, message); } /** diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysNoticeController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysNoticeController.java index 86abb9a8c..e1bafe22f 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysNoticeController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysNoticeController.java @@ -64,7 +64,7 @@ public class SysNoticeController extends BaseController { return R.fail(); } String type = dictService.getDictLabel("sys_notice_type", notice.getNoticeType()); - SseMessageUtils.publishAll("[" + type + "] " + notice.getNoticeTitle()); + SseMessageUtils.publishAll("message", "[" + type + "] " + notice.getNoticeTitle()); return R.ok(); }