update 消息推送增加 消息类型 消息来源 前端跳转路径等扩展参数

This commit is contained in:
疯狂的狮子Li
2026-03-26 15:34:02 +08:00
parent fa8e1cd3c0
commit 40011e9acd
13 changed files with 443 additions and 9 deletions

View File

@@ -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;
}

View File

@@ -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);
}

View File

@@ -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);
});
}
});

View File

@@ -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 会话发送原始消息对象。
*