From ef6c93365c3464ea1ae5afcb3c08f69667f6431c Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Mon, 27 May 2024 14:32:36 +0800 Subject: [PATCH] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96websocket=E6=B6=88?= =?UTF-8?q?=E6=81=AF=E7=BB=93=E6=9E=84=E7=B1=BB=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/controller/AuthController.java | 2 ++ .../websocket/dto/WebSocketMessageDto.java | 6 ++++ .../common/websocket/enums/MsgType.java | 32 +++++++++++++++++++ .../listener/WebSocketTopicListener.java | 6 ++-- .../websocket/utils/WebSocketUtils.java | 23 +++++++------ .../system/SysNoticeController.java | 3 +- .../dromara/workflow/utils/WorkflowUtils.java | 2 ++ 7 files changed, 61 insertions(+), 13 deletions(-) create mode 100644 ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/enums/MsgType.java 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 43e689be3..002a9040b 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 @@ -24,6 +24,7 @@ import org.dromara.common.social.config.properties.SocialProperties; import org.dromara.common.social.utils.SocialUtils; import org.dromara.common.tenant.helper.TenantHelper; import org.dromara.common.websocket.dto.WebSocketMessageDto; +import org.dromara.common.websocket.enums.MsgType; import org.dromara.common.websocket.utils.WebSocketUtils; import org.dromara.system.domain.bo.SysTenantBo; import org.dromara.system.domain.vo.SysClientVo; @@ -100,6 +101,7 @@ public class AuthController { WebSocketMessageDto dto = new WebSocketMessageDto(); dto.setMessage("欢迎登录RuoYi-Vue-Plus后台管理系统"); dto.setSessionKeys(List.of(userId)); + dto.setMsgType(MsgType.MSG); WebSocketUtils.publishMessage(dto); }, 3, TimeUnit.SECONDS); return R.ok(loginVo); 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 e2d4456a0..2385ec919 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,6 +1,7 @@ package org.dromara.common.websocket.dto; import lombok.Data; +import org.dromara.common.websocket.enums.MsgType; import java.io.Serial; import java.io.Serializable; @@ -22,6 +23,11 @@ public class WebSocketMessageDto implements Serializable { */ private List sessionKeys; + /** + * 消息类型 + */ + private MsgType msgType; + /** * 需要发送的消息 */ diff --git a/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/enums/MsgType.java b/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/enums/MsgType.java new file mode 100644 index 000000000..b4ca8396c --- /dev/null +++ b/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/enums/MsgType.java @@ -0,0 +1,32 @@ +package org.dromara.common.websocket.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 消息结构类型 + * + * @author AprilWind + */ +@Getter +@AllArgsConstructor +public enum MsgType { + + /** + * 消息 + */ + MSG("msg"), + + /** + * 通知 + */ + NOTIFY("notify"), + + /** + * 待办 + */ + TODO("todo"); + + private final String msgType; + +} 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 0ad39affe..36f62a6e9 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.getSessionKeys(), message.getMessage()); + log.info("WebSocket主题订阅收到消息session keys={} msgType={} message={}", message.getSessionKeys(), message.getMsgType(), message.getMessage()); // 如果key不为空就按照key发消息 如果为空就群发 if (CollUtil.isNotEmpty(message.getSessionKeys())) { message.getSessionKeys().forEach(key -> { if (WebSocketSessionHolder.existSession(key)) { - WebSocketUtils.sendMessage(key, message.getMessage()); + WebSocketUtils.sendMessage(key, message.getMsgType(), message.getMessage()); } }); } else { WebSocketSessionHolder.getSessionsAll().forEach(key -> { - WebSocketUtils.sendMessage(key, message.getMessage()); + WebSocketUtils.sendMessage(key, message.getMsgType(), 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 afe76e06d..91cede161 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 @@ -1,11 +1,14 @@ package org.dromara.common.websocket.utils; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjUtil; import lombok.AccessLevel; import lombok.NoArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.dromara.common.json.utils.JsonUtils; import org.dromara.common.redis.utils.RedisUtils; import org.dromara.common.websocket.dto.WebSocketMessageDto; +import org.dromara.common.websocket.enums.MsgType; import org.dromara.common.websocket.holder.WebSocketSessionHolder; import org.springframework.web.socket.PongMessage; import org.springframework.web.socket.TextMessage; @@ -14,6 +17,7 @@ import org.springframework.web.socket.WebSocketSession; import java.io.IOException; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.function.Consumer; @@ -34,9 +38,10 @@ public class WebSocketUtils { * @param sessionKey 要发送消息的用户id * @param message 要发送的消息内容 */ - public static void sendMessage(Long sessionKey, String message) { + public static void sendMessage(Long sessionKey, MsgType msgType, String message) { WebSocketSession session = WebSocketSessionHolder.getSessions(sessionKey); - sendMessage(session, message); + sendMessage(session, ObjUtil.isNotEmpty(msgType) ? + JsonUtils.toJsonString(Collections.singletonMap(msgType.getMsgType(), message)) : message); } /** @@ -58,7 +63,7 @@ public class WebSocketUtils { // 当前服务内session,直接发送消息 for (Long sessionKey : webSocketMessage.getSessionKeys()) { if (WebSocketSessionHolder.existSession(sessionKey)) { - WebSocketUtils.sendMessage(sessionKey, webSocketMessage.getMessage()); + WebSocketUtils.sendMessage(sessionKey, webSocketMessage.getMsgType(), webSocketMessage.getMessage()); continue; } unsentSessionKeys.add(sessionKey); @@ -67,10 +72,11 @@ public class WebSocketUtils { if (CollUtil.isNotEmpty(unsentSessionKeys)) { WebSocketMessageDto broadcastMessage = new WebSocketMessageDto(); broadcastMessage.setMessage(webSocketMessage.getMessage()); + broadcastMessage.setMsgType(webSocketMessage.getMsgType()); broadcastMessage.setSessionKeys(unsentSessionKeys); RedisUtils.publish(WEB_SOCKET_TOPIC, broadcastMessage, consumer -> { - log.info(" WebSocket发送主题订阅消息topic:{} session keys:{} message:{}", - WEB_SOCKET_TOPIC, unsentSessionKeys, webSocketMessage.getMessage()); + log.info(" WebSocket发送主题订阅消息topic:{} session keys:{} msgType={} message:{}", + WEB_SOCKET_TOPIC, unsentSessionKeys, webSocketMessage.getMsgType(), webSocketMessage.getMessage()); }); } } @@ -80,12 +86,11 @@ public class WebSocketUtils { * * @param message 要发布的消息内容 */ - public static void publishAll(String message) { + public static void publishAll(MsgType msgType, String message) { WebSocketMessageDto broadcastMessage = new WebSocketMessageDto(); + broadcastMessage.setMsgType(msgType); broadcastMessage.setMessage(message); - RedisUtils.publish(WEB_SOCKET_TOPIC, broadcastMessage, consumer -> { - log.info("WebSocket发送主题订阅消息topic:{} message:{}", WEB_SOCKET_TOPIC, message); - }); + RedisUtils.publish(WEB_SOCKET_TOPIC, broadcastMessage, consumer -> log.info("WebSocket发送主题订阅消息topic:{} message:{}", WEB_SOCKET_TOPIC, 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 a0aa26eba..cde9e134f 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 @@ -9,6 +9,7 @@ import org.dromara.common.log.enums.BusinessType; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.web.core.BaseController; +import org.dromara.common.websocket.enums.MsgType; import org.dromara.common.websocket.utils.WebSocketUtils; import org.dromara.system.domain.bo.SysNoticeBo; import org.dromara.system.domain.vo.SysNoticeVo; @@ -62,7 +63,7 @@ public class SysNoticeController extends BaseController { return R.fail(); } String type = dictService.getDictLabel("sys_notice_type", notice.getNoticeType()); - WebSocketUtils.publishAll("[" + type + "] " + notice.getNoticeTitle()); + WebSocketUtils.publishAll(MsgType.NOTIFY, "[" + type + "] " + notice.getNoticeTitle()); return R.ok(); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java index a620289e9..a5a4df305 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java @@ -18,6 +18,7 @@ import org.dromara.common.mail.utils.MailUtils; import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.common.tenant.helper.TenantHelper; import org.dromara.common.websocket.dto.WebSocketMessageDto; +import org.dromara.common.websocket.enums.MsgType; import org.dromara.common.websocket.utils.WebSocketUtils; import org.dromara.workflow.common.constant.FlowConstant; import org.dromara.workflow.common.enums.BusinessStatusEnum; @@ -329,6 +330,7 @@ public class WorkflowUtils { case SYSTEM_MESSAGE: WebSocketMessageDto dto = new WebSocketMessageDto(); dto.setSessionKeys(new ArrayList<>(userIds)); + dto.setMsgType(MsgType.TODO); dto.setMessage(message); WebSocketUtils.publishMessage(dto); break;