From 9aed0b06ca5396b7adee5d755104d562bcb2c153 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90Li?= <15040126243@163.com> Date: Tue, 17 Mar 2026 21:04:24 +0800 Subject: [PATCH] =?UTF-8?q?update=20=E5=9B=9E=E6=BB=9A=E9=94=99=E8=AF=AF?= =?UTF-8?q?=E7=9A=84=E4=BF=AE=E6=94=B9=20record=E6=97=A0=E6=B3=95=E6=8A=95?= =?UTF-8?q?=E9=80=92=E5=88=B0redis=E5=BA=8F=E5=88=97=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/controller/AuthController.java | 7 +++-- .../common/sse/core/SseEmitterManager.java | 9 ++++--- .../dromara/common/sse/dto/SseMessageDTO.java | 27 ++++++++++++++----- .../common/sse/listener/SseTopicListener.java | 10 +++---- .../websocket/dto/WebSocketMessageDTO.java | 27 ++++++++++++++----- .../handler/PlusWebSocketHandler.java | 4 ++- .../listener/WebSocketTopicListener.java | 10 +++---- .../websocket/utils/WebSocketUtils.java | 13 +++++---- .../service/impl/FlwCommonServiceImpl.java | 4 ++- 9 files changed, 73 insertions(+), 38 deletions(-) diff --git a/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java b/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java index b1896fc01..fc524645a 100644 --- a/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java +++ b/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java @@ -93,10 +93,9 @@ public class AuthController { Long userId = LoginHelper.getUserId(); scheduledExecutorService.schedule(() -> { - SseMessageDTO dto = new SseMessageDTO( - List.of(userId), - DateUtils.getTodayHour(new Date()) + "好,欢迎登录 RuoYi-Vue-Plus 后台管理系统" - ); + SseMessageDTO dto = new SseMessageDTO(); + dto.setUserIds(List.of(userId)); + dto.setMessage(DateUtils.getTodayHour(new Date()) + "好,欢迎登录 RuoYi-Vue-Plus 后台管理系统"); SseMessageUtils.publishMessage(dto); }, 5, TimeUnit.SECONDS); return R.ok(loginVo); 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 09d35923e..d8504d703 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 @@ -205,10 +205,12 @@ public class SseEmitterManager { * @param sseMessageDTO 要发布的SSE消息对象 */ public void publishMessage(SseMessageDTO sseMessageDTO) { - SseMessageDTO broadcastMessage = new SseMessageDTO(sseMessageDTO.userIds(), sseMessageDTO.message()); + SseMessageDTO broadcastMessage = new SseMessageDTO(); + broadcastMessage.setUserIds(sseMessageDTO.getUserIds()); + broadcastMessage.setMessage(sseMessageDTO.getMessage()); RedisUtils.publish(SSE_TOPIC, broadcastMessage, consumer -> { log.info("SSE发送主题订阅消息topic:{} session keys:{} message:{}", - SSE_TOPIC, sseMessageDTO.userIds(), sseMessageDTO.message()); + SSE_TOPIC, sseMessageDTO.getUserIds(), sseMessageDTO.getMessage()); }); } @@ -218,7 +220,8 @@ public class SseEmitterManager { * @param message 要发布的消息内容 */ public void publishAll(String message) { - SseMessageDTO broadcastMessage = new SseMessageDTO(null, message); + SseMessageDTO broadcastMessage = new SseMessageDTO(); + broadcastMessage.setMessage(message); RedisUtils.publish(SSE_TOPIC, broadcastMessage, consumer -> { log.info("SSE发送主题订阅消息topic:{} message:{}", SSE_TOPIC, 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 8a2bf90ce..1adc5108c 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 @@ -1,16 +1,29 @@ package org.dromara.common.sse.dto; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; import java.util.List; /** - * 消息的DTO + * 消息的dto * - * @param userIds 接收消息的用户 ID 列表 - * @param message 推送消息内容 * @author zendwang */ -public record SseMessageDTO( - List userIds, - String message -) { +@Data +public class SseMessageDTO implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 需要推送到的session key 列表 + */ + private List userIds; + + /** + * 需要发送的消息 + */ + private String message; } 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 5f452d22f..7a4dff13e 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.userIds(), message.message()); + log.info("SSE主题订阅收到消息session keys={} message={}", message.getUserIds(), message.getMessage()); // 如果key不为空就按照key发消息 如果为空就群发 - if (CollUtil.isNotEmpty(message.userIds())) { - message.userIds().forEach(key -> { - sseEmitterManager.sendMessage(key, message.message()); + if (CollUtil.isNotEmpty(message.getUserIds())) { + message.getUserIds().forEach(key -> { + sseEmitterManager.sendMessage(key, message.getMessage()); }); } else { - sseEmitterManager.sendMessage(message.message()); + sseEmitterManager.sendMessage(message.getMessage()); } }); log.info("初始化SSE主题订阅监听器成功"); diff --git a/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/dto/WebSocketMessageDTO.java b/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/dto/WebSocketMessageDTO.java index a2efd7b29..452475c40 100644 --- a/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/dto/WebSocketMessageDTO.java +++ b/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/dto/WebSocketMessageDTO.java @@ -1,16 +1,29 @@ package org.dromara.common.websocket.dto; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; import java.util.List; /** - * 消息的DTO + * 消息的dto * - * @param sessionKeys WebSocket 会话标识列表 - * @param message 推送消息内容 * @author zendwang */ -public record WebSocketMessageDTO( - List sessionKeys, - String message -) { +@Data +public class WebSocketMessageDTO implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 需要推送到的session key 列表 + */ + private List sessionKeys; + + /** + * 需要发送的消息 + */ + private String message; } diff --git a/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/handler/PlusWebSocketHandler.java b/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/handler/PlusWebSocketHandler.java index da9a326f6..b905ae066 100644 --- a/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/handler/PlusWebSocketHandler.java +++ b/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/handler/PlusWebSocketHandler.java @@ -51,7 +51,9 @@ public class PlusWebSocketHandler extends AbstractWebSocketHandler { LoginUser loginUser = (LoginUser) session.getAttributes().get(LOGIN_USER_KEY); // 创建WebSocket消息DTO对象 - WebSocketMessageDTO messageDTO = new WebSocketMessageDTO(List.of(loginUser.getUserId()), message.getPayload()); + WebSocketMessageDTO messageDTO = new WebSocketMessageDTO(); + messageDTO.setSessionKeys(List.of(loginUser.getUserId())); + messageDTO.setMessage(message.getPayload()); WebSocketUtils.publishMessage(messageDTO); } diff --git a/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/listener/WebSocketTopicListener.java b/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/listener/WebSocketTopicListener.java index 77709e5b6..0ad39affe 100644 --- a/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/listener/WebSocketTopicListener.java +++ b/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/listener/WebSocketTopicListener.java @@ -26,17 +26,17 @@ public class WebSocketTopicListener implements ApplicationRunner, Ordered { public void run(ApplicationArguments args) throws Exception { // 订阅WebSocket消息 WebSocketUtils.subscribeMessage((message) -> { - log.info("WebSocket主题订阅收到消息session keys={} message={}", message.sessionKeys(), message.message()); + log.info("WebSocket主题订阅收到消息session keys={} message={}", message.getSessionKeys(), message.getMessage()); // 如果key不为空就按照key发消息 如果为空就群发 - if (CollUtil.isNotEmpty(message.sessionKeys())) { - message.sessionKeys().forEach(key -> { + if (CollUtil.isNotEmpty(message.getSessionKeys())) { + message.getSessionKeys().forEach(key -> { if (WebSocketSessionHolder.existSession(key)) { - WebSocketUtils.sendMessage(key, message.message()); + WebSocketUtils.sendMessage(key, message.getMessage()); } }); } else { WebSocketSessionHolder.getSessionsAll().forEach(key -> { - WebSocketUtils.sendMessage(key, message.message()); + WebSocketUtils.sendMessage(key, message.getMessage()); }); } }); diff --git a/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/utils/WebSocketUtils.java b/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/utils/WebSocketUtils.java index 44b31c97f..2d2c0c921 100644 --- a/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/utils/WebSocketUtils.java +++ b/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/utils/WebSocketUtils.java @@ -56,19 +56,21 @@ public class WebSocketUtils { public static void publishMessage(WebSocketMessageDTO webSocketMessage) { List unsentSessionKeys = new ArrayList<>(); // 当前服务内session,直接发送消息 - for (Long sessionKey : webSocketMessage.sessionKeys()) { + for (Long sessionKey : webSocketMessage.getSessionKeys()) { if (WebSocketSessionHolder.existSession(sessionKey)) { - WebSocketUtils.sendMessage(sessionKey, webSocketMessage.message()); + WebSocketUtils.sendMessage(sessionKey, webSocketMessage.getMessage()); continue; } unsentSessionKeys.add(sessionKey); } // 不在当前服务内session,发布订阅消息 if (CollUtil.isNotEmpty(unsentSessionKeys)) { - WebSocketMessageDTO broadcastMessage = new WebSocketMessageDTO(unsentSessionKeys, webSocketMessage.message()); + WebSocketMessageDTO broadcastMessage = new WebSocketMessageDTO(); + broadcastMessage.setSessionKeys(unsentSessionKeys); + broadcastMessage.setMessage(webSocketMessage.getMessage()); RedisUtils.publish(WEB_SOCKET_TOPIC, broadcastMessage, consumer -> { log.info(" WebSocket发送主题订阅消息topic:{} session keys:{} message:{}", - WEB_SOCKET_TOPIC, unsentSessionKeys, webSocketMessage.message()); + WEB_SOCKET_TOPIC, unsentSessionKeys, webSocketMessage.getMessage()); }); } } @@ -79,7 +81,8 @@ public class WebSocketUtils { * @param message 要发布的消息内容 */ public static void publishAll(String message) { - WebSocketMessageDTO broadcastMessage = new WebSocketMessageDTO(null, message); + WebSocketMessageDTO broadcastMessage = new WebSocketMessageDTO(); + broadcastMessage.setMessage(message); RedisUtils.publish(WEB_SOCKET_TOPIC, broadcastMessage, consumer -> { log.info("WebSocket发送主题订阅消息topic:{} message:{}", WEB_SOCKET_TOPIC, message); }); diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwCommonServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwCommonServiceImpl.java index 31fb3f85e..57ed2af71 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwCommonServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwCommonServiceImpl.java @@ -92,7 +92,9 @@ public class FlwCommonServiceImpl implements IFlwCommonService { try { switch (messageTypeEnum) { case SYSTEM_MESSAGE -> { - SseMessageDTO dto = new SseMessageDTO(userIds, message); + SseMessageDTO dto = new SseMessageDTO(); + dto.setUserIds(userIds); + dto.setMessage(message); SseMessageUtils.publishMessage(dto); } case EMAIL_MESSAGE -> MailUtils.sendText(emails, subject, message);