mirror of
https://gitee.com/dromara/RuoYi-Vue-Plus.git
synced 2026-04-11 13:03:17 +08:00
update 消息推送增加 消息类型 消息来源 前端跳转路径等扩展参数
This commit is contained in:
@@ -5,6 +5,7 @@ import lombok.Data;
|
||||
import java.io.Serial;
|
||||
import java.io.Serializable;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* 消息的dto
|
||||
@@ -26,4 +27,29 @@ public class WebSocketMessageDTO implements Serializable {
|
||||
* 需要发送的消息
|
||||
*/
|
||||
private String message;
|
||||
|
||||
/**
|
||||
* 消息类型
|
||||
*/
|
||||
private String messageType;
|
||||
|
||||
/**
|
||||
* 消息来源
|
||||
*/
|
||||
private String messageSource;
|
||||
|
||||
/**
|
||||
* 扩展数据
|
||||
*/
|
||||
private Object data;
|
||||
|
||||
/**
|
||||
* 前端跳转路径
|
||||
*/
|
||||
private String path;
|
||||
|
||||
/**
|
||||
* 前端跳转参数
|
||||
*/
|
||||
private Map<String, Object> query;
|
||||
}
|
||||
|
||||
@@ -2,6 +2,8 @@ package org.dromara.common.websocket.handler;
|
||||
|
||||
import cn.hutool.core.util.ObjectUtil;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.dromara.common.core.enums.PushSourceEnum;
|
||||
import org.dromara.common.core.enums.PushTypeEnum;
|
||||
import org.dromara.common.core.domain.model.LoginUser;
|
||||
import org.dromara.common.websocket.dto.WebSocketMessageDTO;
|
||||
import org.dromara.common.websocket.holder.WebSocketSessionHolder;
|
||||
@@ -54,6 +56,8 @@ public class PlusWebSocketHandler extends AbstractWebSocketHandler {
|
||||
WebSocketMessageDTO messageDTO = new WebSocketMessageDTO();
|
||||
messageDTO.setSessionKeys(List.of(loginUser.getUserId()));
|
||||
messageDTO.setMessage(message.getPayload());
|
||||
messageDTO.setMessageType(PushTypeEnum.CUSTOM.getType());
|
||||
messageDTO.setMessageSource(PushSourceEnum.CLIENT.getSource());
|
||||
WebSocketUtils.publishMessage(messageDTO);
|
||||
}
|
||||
|
||||
|
||||
@@ -31,12 +31,12 @@ public class WebSocketTopicListener implements ApplicationRunner, Ordered {
|
||||
if (CollUtil.isNotEmpty(message.getSessionKeys())) {
|
||||
message.getSessionKeys().forEach(key -> {
|
||||
if (WebSocketSessionHolder.existSession(key)) {
|
||||
WebSocketUtils.sendMessage(key, message.getMessage());
|
||||
WebSocketUtils.sendMessage(key, message);
|
||||
}
|
||||
});
|
||||
} else {
|
||||
WebSocketSessionHolder.getSessionsAll().forEach(key -> {
|
||||
WebSocketUtils.sendMessage(key, message.getMessage());
|
||||
WebSocketUtils.sendMessage(key, message);
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
@@ -4,6 +4,8 @@ import cn.hutool.core.collection.CollUtil;
|
||||
import lombok.AccessLevel;
|
||||
import lombok.NoArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.dromara.common.core.domain.dto.PushPayload;
|
||||
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.holder.WebSocketSessionHolder;
|
||||
@@ -39,6 +41,17 @@ public class WebSocketUtils {
|
||||
sendMessage(session, message);
|
||||
}
|
||||
|
||||
/**
|
||||
* 向指定会话标识发送统一 JSON 消息。
|
||||
*
|
||||
* @param sessionKey 要发送消息的用户id
|
||||
* @param webSocketMessage 要发送的消息内容
|
||||
*/
|
||||
public static void sendMessage(Long sessionKey, WebSocketMessageDTO webSocketMessage) {
|
||||
WebSocketSession session = WebSocketSessionHolder.getSessions(sessionKey);
|
||||
sendMessage(session, buildPayload(webSocketMessage));
|
||||
}
|
||||
|
||||
/**
|
||||
* 订阅 WebSocket 广播主题消息。
|
||||
*
|
||||
@@ -58,7 +71,7 @@ public class WebSocketUtils {
|
||||
// 当前服务内session,直接发送消息
|
||||
for (Long sessionKey : webSocketMessage.getSessionKeys()) {
|
||||
if (WebSocketSessionHolder.existSession(sessionKey)) {
|
||||
WebSocketUtils.sendMessage(sessionKey, webSocketMessage.getMessage());
|
||||
WebSocketUtils.sendMessage(sessionKey, webSocketMessage);
|
||||
continue;
|
||||
}
|
||||
unsentSessionKeys.add(sessionKey);
|
||||
@@ -88,6 +101,43 @@ public class WebSocketUtils {
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 向指定会话标识发布统一 JSON 消息。
|
||||
*
|
||||
* @param sessionKeys 目标会话
|
||||
* @param payload 消息体
|
||||
*/
|
||||
public static void publishMessage(List<Long> sessionKeys, PushPayload payload) {
|
||||
WebSocketMessageDTO dto = new WebSocketMessageDTO();
|
||||
dto.setSessionKeys(sessionKeys);
|
||||
dto.setMessage(payload.getMessage());
|
||||
dto.setMessageType(payload.getType());
|
||||
dto.setMessageSource(payload.getSource());
|
||||
dto.setData(payload.getData());
|
||||
dto.setPath(payload.getPath());
|
||||
dto.setQuery(payload.getQuery());
|
||||
publishMessage(dto);
|
||||
}
|
||||
|
||||
/**
|
||||
* 向所有 WebSocket 会话发布统一 JSON 消息。
|
||||
*
|
||||
* @param payload 消息体
|
||||
*/
|
||||
public static void publishAll(PushPayload payload) {
|
||||
WebSocketMessageDTO broadcastMessage = new WebSocketMessageDTO();
|
||||
broadcastMessage.setMessage(payload.getMessage());
|
||||
broadcastMessage.setMessageType(payload.getType());
|
||||
broadcastMessage.setMessageSource(payload.getSource());
|
||||
broadcastMessage.setData(payload.getData());
|
||||
broadcastMessage.setPath(payload.getPath());
|
||||
broadcastMessage.setQuery(payload.getQuery());
|
||||
RedisUtils.publish(WEB_SOCKET_TOPIC, broadcastMessage, consumer -> {
|
||||
log.info("WebSocket发送主题订阅消息topic:{} type:{} source:{} message:{}",
|
||||
WEB_SOCKET_TOPIC, payload.getType(), payload.getSource(), payload.getMessage());
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 向指定会话发送 Pong 心跳消息。
|
||||
*
|
||||
@@ -107,6 +157,18 @@ public class WebSocketUtils {
|
||||
sendMessage(session, new TextMessage(message));
|
||||
}
|
||||
|
||||
private static String buildPayload(WebSocketMessageDTO webSocketMessage) {
|
||||
PushPayload payload = PushPayload.of(
|
||||
webSocketMessage.getMessageType(),
|
||||
webSocketMessage.getMessageSource(),
|
||||
webSocketMessage.getMessage(),
|
||||
webSocketMessage.getData()
|
||||
);
|
||||
payload.setPath(webSocketMessage.getPath());
|
||||
payload.setQuery(webSocketMessage.getQuery());
|
||||
return JsonUtils.toJsonString(payload);
|
||||
}
|
||||
|
||||
/**
|
||||
* 向指定 WebSocket 会话发送原始消息对象。
|
||||
*
|
||||
|
||||
Reference in New Issue
Block a user