mirror of
https://gitee.com/dromara/RuoYi-Vue-Plus.git
synced 2026-04-13 05:53:16 +08:00
update 消息推送增加 消息类型 消息来源 前端跳转路径等扩展参数
This commit is contained in:
@@ -3,7 +3,9 @@ package org.dromara.common.sse.core;
|
||||
import cn.hutool.core.collection.CollUtil;
|
||||
import cn.hutool.core.map.MapUtil;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.dromara.common.core.domain.dto.PushPayload;
|
||||
import org.dromara.common.core.utils.SpringUtils;
|
||||
import org.dromara.common.json.utils.JsonUtils;
|
||||
import org.dromara.common.redis.utils.RedisUtils;
|
||||
import org.dromara.common.sse.dto.SseMessageDTO;
|
||||
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
|
||||
@@ -188,6 +190,26 @@ public class SseEmitterManager {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 向指定用户的全部本地 SSE 会话发送统一 JSON 消息。
|
||||
*
|
||||
* @param userId 要发送消息的用户id
|
||||
* @param payload 要发送的消息体
|
||||
*/
|
||||
public void sendMessage(Long userId, PushPayload payload) {
|
||||
sendMessage(userId, JsonUtils.toJsonString(payload));
|
||||
}
|
||||
|
||||
/**
|
||||
* 向指定用户的全部本地 SSE 会话发送统一 JSON 消息。
|
||||
*
|
||||
* @param userId 要发送消息的用户id
|
||||
* @param sseMessageDTO 要发送的消息内容
|
||||
*/
|
||||
public void sendMessage(Long userId, SseMessageDTO sseMessageDTO) {
|
||||
sendMessage(userId, buildPayload(sseMessageDTO));
|
||||
}
|
||||
|
||||
/**
|
||||
* 向当前节点所有 SSE 会话发送消息。
|
||||
*
|
||||
@@ -199,6 +221,15 @@ public class SseEmitterManager {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 向当前节点所有 SSE 会话发送统一 JSON 消息。
|
||||
*
|
||||
* @param payload 要发送的消息体
|
||||
*/
|
||||
public void sendMessage(PushPayload payload) {
|
||||
sendMessage(JsonUtils.toJsonString(payload));
|
||||
}
|
||||
|
||||
/**
|
||||
* 发布 SSE 订阅消息。
|
||||
*
|
||||
@@ -226,4 +257,35 @@ public class SseEmitterManager {
|
||||
log.info("SSE发送主题订阅消息topic:{} message:{}", SSE_TOPIC, message);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 发布 SSE 广播 JSON 消息。
|
||||
*
|
||||
* @param payload 要发布的消息体
|
||||
*/
|
||||
public void publishAll(PushPayload payload) {
|
||||
SseMessageDTO broadcastMessage = new SseMessageDTO();
|
||||
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(SSE_TOPIC, broadcastMessage, consumer -> {
|
||||
log.info("SSE发送主题订阅消息topic:{} type:{} source:{} message:{}",
|
||||
SSE_TOPIC, payload.getType(), payload.getSource(), payload.getMessage());
|
||||
});
|
||||
}
|
||||
|
||||
private String buildPayload(SseMessageDTO sseMessageDTO) {
|
||||
PushPayload payload = PushPayload.of(
|
||||
sseMessageDTO.getMessageType(),
|
||||
sseMessageDTO.getMessageSource(),
|
||||
sseMessageDTO.getMessage(),
|
||||
sseMessageDTO.getData()
|
||||
);
|
||||
payload.setPath(sseMessageDTO.getPath());
|
||||
payload.setQuery(sseMessageDTO.getQuery());
|
||||
return JsonUtils.toJsonString(payload);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 SseMessageDTO implements Serializable {
|
||||
* 需要发送的消息
|
||||
*/
|
||||
private String message;
|
||||
|
||||
/**
|
||||
* 消息类型
|
||||
*/
|
||||
private String messageType;
|
||||
|
||||
/**
|
||||
* 消息来源
|
||||
*/
|
||||
private String messageSource;
|
||||
|
||||
/**
|
||||
* 扩展数据
|
||||
*/
|
||||
private Object data;
|
||||
|
||||
/**
|
||||
* 前端跳转路径
|
||||
*/
|
||||
private String path;
|
||||
|
||||
/**
|
||||
* 前端跳转参数
|
||||
*/
|
||||
private Map<String, Object> query;
|
||||
}
|
||||
|
||||
@@ -32,10 +32,17 @@ public class SseTopicListener implements ApplicationRunner, Ordered {
|
||||
// 如果key不为空就按照key发消息 如果为空就群发
|
||||
if (CollUtil.isNotEmpty(message.getUserIds())) {
|
||||
message.getUserIds().forEach(key -> {
|
||||
sseEmitterManager.sendMessage(key, message.getMessage());
|
||||
sseEmitterManager.sendMessage(key, message);
|
||||
});
|
||||
} else {
|
||||
sseEmitterManager.sendMessage(message.getMessage());
|
||||
sseEmitterManager.sendMessage(
|
||||
org.dromara.common.core.domain.dto.PushPayload.of(
|
||||
message.getMessageType(),
|
||||
message.getMessageSource(),
|
||||
message.getMessage(),
|
||||
message.getData()
|
||||
)
|
||||
);
|
||||
}
|
||||
});
|
||||
log.info("初始化SSE主题订阅监听器成功");
|
||||
|
||||
@@ -3,10 +3,15 @@ package org.dromara.common.sse.utils;
|
||||
import lombok.AccessLevel;
|
||||
import lombok.NoArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.dromara.common.core.domain.dto.PushPayload;
|
||||
import org.dromara.common.core.enums.PushSourceEnum;
|
||||
import org.dromara.common.core.enums.PushTypeEnum;
|
||||
import org.dromara.common.core.utils.SpringUtils;
|
||||
import org.dromara.common.sse.core.SseEmitterManager;
|
||||
import org.dromara.common.sse.dto.SseMessageDTO;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* SSE工具类
|
||||
*
|
||||
@@ -35,7 +40,7 @@ public class SseMessageUtils {
|
||||
if (!isEnable()) {
|
||||
return;
|
||||
}
|
||||
MANAGER.sendMessage(userId, message);
|
||||
MANAGER.sendMessage(userId, buildMessage(message));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -47,7 +52,32 @@ public class SseMessageUtils {
|
||||
if (!isEnable()) {
|
||||
return;
|
||||
}
|
||||
MANAGER.sendMessage(message);
|
||||
MANAGER.sendMessage(buildMessage(message));
|
||||
}
|
||||
|
||||
/**
|
||||
* 向指定用户的 SSE 会话发送统一 JSON 消息。
|
||||
*
|
||||
* @param userId 要发送消息的用户id
|
||||
* @param payload 要发送的消息体
|
||||
*/
|
||||
public static void sendMessage(Long userId, PushPayload payload) {
|
||||
if (!isEnable()) {
|
||||
return;
|
||||
}
|
||||
MANAGER.sendMessage(userId, payload);
|
||||
}
|
||||
|
||||
/**
|
||||
* 向当前节点上的所有 SSE 会话发送统一 JSON 消息。
|
||||
*
|
||||
* @param payload 要发送的消息体
|
||||
*/
|
||||
public static void sendMessage(PushPayload payload) {
|
||||
if (!isEnable()) {
|
||||
return;
|
||||
}
|
||||
MANAGER.sendMessage(payload);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -71,7 +101,40 @@ public class SseMessageUtils {
|
||||
if (!isEnable()) {
|
||||
return;
|
||||
}
|
||||
MANAGER.publishAll(message);
|
||||
MANAGER.publishAll(buildMessage(message));
|
||||
}
|
||||
|
||||
/**
|
||||
* 向指定用户发布统一 JSON 消息。
|
||||
*
|
||||
* @param userIds 目标用户
|
||||
* @param payload 消息体
|
||||
*/
|
||||
public static void publishMessage(List<Long> userIds, PushPayload payload) {
|
||||
if (!isEnable()) {
|
||||
return;
|
||||
}
|
||||
SseMessageDTO dto = new SseMessageDTO();
|
||||
dto.setUserIds(userIds);
|
||||
dto.setMessage(payload.getMessage());
|
||||
dto.setMessageType(payload.getType());
|
||||
dto.setMessageSource(payload.getSource());
|
||||
dto.setData(payload.getData());
|
||||
dto.setPath(payload.getPath());
|
||||
dto.setQuery(payload.getQuery());
|
||||
MANAGER.publishMessage(dto);
|
||||
}
|
||||
|
||||
/**
|
||||
* 向所有用户发布统一 JSON 消息。
|
||||
*
|
||||
* @param payload 消息体
|
||||
*/
|
||||
public static void publishAll(PushPayload payload) {
|
||||
if (!isEnable()) {
|
||||
return;
|
||||
}
|
||||
MANAGER.publishAll(payload);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -83,4 +146,8 @@ public class SseMessageUtils {
|
||||
return SSE_ENABLE;
|
||||
}
|
||||
|
||||
private static PushPayload buildMessage(String message) {
|
||||
return PushPayload.of(PushTypeEnum.MESSAGE, PushSourceEnum.BACKEND, message, null);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user