From c96fbe6b0aeb413a17c429133ee6d81d138144b9 Mon Sep 17 00:00:00 2001
From: liujie <1793218484@qq.com>
Date: 星期二, 09 六月 2026 10:58:52 +0800
Subject: [PATCH] Merge branch '1.0' of http://120.76.84.145:10101/gitblit/r/java/Robotaxi into 1.0
---
xp-robotaxi-push-message-boot/src/main/java/com/xiaopeng/pushMessage/webSocket/service/WebSocketUserConnectionManager.java | 75 +++++++++++++++++++------------------
1 files changed, 38 insertions(+), 37 deletions(-)
diff --git a/xp-robotaxi-push-message-boot/src/main/java/com/xiaopeng/pushMessage/webSocket/service/WebSocketUserConnectionManager.java b/xp-robotaxi-push-message-boot/src/main/java/com/xiaopeng/pushMessage/webSocket/service/WebSocketUserConnectionManager.java
index fa84485..c6c42f7 100644
--- a/xp-robotaxi-push-message-boot/src/main/java/com/xiaopeng/pushMessage/webSocket/service/WebSocketUserConnectionManager.java
+++ b/xp-robotaxi-push-message-boot/src/main/java/com/xiaopeng/pushMessage/webSocket/service/WebSocketUserConnectionManager.java
@@ -9,34 +9,35 @@
import java.util.concurrent.ConcurrentHashMap;
/**
- * 基于AppUser的WebSocket连接管理器
- * 支持按用户ID管理连接,一个用户可以有多个设备连接
+ * 基于 AppUser 的 WebSocket 连接管理器
+ * 使用 Spring WebSocketSession(共用 Spring Boot HTTP 端口)
+ * 支持按用户 ID 管理连接,一个用户可以有多个设备连接
*/
@Component
@Slf4j
public class WebSocketUserConnectionManager {
-
+
/**
* 存储用户的所有连接
* Key: 用户ID (appUserId)
* Value: 该用户的所有连接Channel列表
*/
private static final ConcurrentHashMap<String, Set<Channel>> userConnections = new ConcurrentHashMap<>();
-
+
/**
* 存储连接与用户的映射关系
* Key: ChannelId.asLongText()
* Value: 用户ID (appUserId)
*/
private static final ConcurrentHashMap<String, String> channelToUser = new ConcurrentHashMap<>();
-
+
/**
* 存储所有连接
* Key: ChannelId.asLongText()
* Value: Channel
*/
private static final ConcurrentHashMap<String, Channel> allConnections = new ConcurrentHashMap<>();
-
+
/**
* 添加用户连接
* @param appUserId 用户ID
@@ -44,21 +45,21 @@
*/
public void addUserConnection(String appUserId, Channel channel) {
String channelId = channel.id().asLongText();
-
+
// 添加到用户连接映射
userConnections.computeIfAbsent(appUserId, k -> ConcurrentHashMap.newKeySet())
.add(channel);
-
+
// 添加到连接用户映射
channelToUser.put(channelId, appUserId);
-
+
// 添加到所有连接
allConnections.put(channelId, channel);
-
- log.info("用户连接已添加,用户ID: {}, ChannelId: {}, 该用户连接数: {}",
+
+ log.info("用户连接已添加,用户ID: {}, ChannelId: {}, 该用户连接数: {}",
appUserId, channelId, userConnections.get(appUserId).size());
}
-
+
/**
* 移除用户连接
* @param channel WebSocket连接通道
@@ -66,7 +67,7 @@
public void removeUserConnection(Channel channel) {
String channelId = channel.id().asLongText();
String appUserId = channelToUser.get(channelId);
-
+
if (appUserId != null) {
// 从用户连接中移除
Set<Channel> userChannels = userConnections.get(appUserId);
@@ -77,18 +78,18 @@
userConnections.remove(appUserId);
}
}
-
+
// 从连接用户映射中移除
channelToUser.remove(channelId);
-
- log.info("用户连接已移除,用户ID: {}, ChannelId: {}, 该用户剩余连接数: {}",
+
+ log.info("用户连接已移除,用户ID: {}, ChannelId: {}, 该用户剩余连接数: {}",
appUserId, channelId, userChannels != null ? userChannels.size() : 0);
}
-
+
// 从所有连接中移除
allConnections.remove(channelId);
}
-
+
/**
* 向指定用户的所有设备发送消息
* @param appUserId 用户ID
@@ -101,7 +102,7 @@
log.warn("用户 {} 没有活跃连接", appUserId);
return 0;
}
-
+
int successCount = 0;
for (Channel channel : userChannels) {
if (channel != null && channel.isActive()) {
@@ -109,17 +110,17 @@
channel.writeAndFlush(new TextWebSocketFrame(message));
successCount++;
} catch (Exception e) {
- log.error("向用户 {} 发送消息失败,连接ID: {}, 错误: {}",
+ log.error("向用户 {} 发送消息失败,连接ID: {}, 错误: {}",
appUserId, channel.id().asLongText(), e.getMessage());
}
}
}
-
- log.info("向用户 {} 发送消息完成,成功发送到 {} 个设备,消息内容: {}",
+
+ log.info("向用户 {} 发送消息完成,成功发送到 {} 个设备,消息内容: {}",
appUserId, successCount, message);
return successCount;
}
-
+
/**
* 向指定连接发送消息
* @param channelId 连接ID
@@ -142,7 +143,7 @@
return false;
}
}
-
+
/**
* 向所有连接广播消息
* @param message 消息内容
@@ -156,7 +157,7 @@
channel.writeAndFlush(new TextWebSocketFrame(message));
successCount++;
} catch (Exception e) {
- log.error("广播消息失败,连接ID: {}, 错误: {}",
+ log.error("广播消息失败,连接ID: {}, 错误: {}",
channel.id().asLongText(), e.getMessage());
}
}
@@ -164,7 +165,7 @@
log.info("广播消息完成,成功发送到 {} 个连接,消息内容: {}", successCount, message);
return successCount;
}
-
+
/**
* 向多个用户发送消息
* @param appUserIds 用户ID列表
@@ -182,7 +183,7 @@
log.info("向 {} 个用户发送消息完成,成功发送到 {} 个用户", appUserIds.size(), successUserCount);
return successUserCount;
}
-
+
/**
* 获取用户的所有连接
* @param appUserId 用户ID
@@ -191,7 +192,7 @@
public Set<Channel> getUserConnections(String appUserId) {
return userConnections.getOrDefault(appUserId, Collections.emptySet());
}
-
+
/**
* 获取用户连接数
* @param appUserId 用户ID
@@ -201,7 +202,7 @@
Set<Channel> userChannels = userConnections.get(appUserId);
return userChannels != null ? userChannels.size() : 0;
}
-
+
/**
* 获取总连接数
* @return 总连接数
@@ -209,7 +210,7 @@
public int getTotalConnectionCount() {
return allConnections.size();
}
-
+
/**
* 获取在线用户数
* @return 在线用户数
@@ -217,7 +218,7 @@
public int getOnlineUserCount() {
return userConnections.size();
}
-
+
/**
* 获取所有在线用户ID
* @return 用户ID集合
@@ -225,7 +226,7 @@
public Set<String> getOnlineUserIds() {
return userConnections.keySet();
}
-
+
/**
* 检查用户是否在线
* @param appUserId 用户ID
@@ -239,7 +240,7 @@
// 检查是否有活跃连接
return userChannels.stream().anyMatch(Channel::isActive);
}
-
+
/**
* 检查连接是否存在
* @param channelId 连接ID
@@ -249,7 +250,7 @@
Channel channel = allConnections.get(channelId);
return channel != null && channel.isActive();
}
-
+
/**
* 根据连接ID获取用户ID
* @param channelId 连接ID
@@ -258,7 +259,7 @@
public String getUserIdByChannelId(String channelId) {
return channelToUser.get(channelId);
}
-
+
/**
* 获取连接统计信息
* @return 统计信息
@@ -268,14 +269,14 @@
stats.put("totalConnections", getTotalConnectionCount());
stats.put("onlineUsers", getOnlineUserCount());
stats.put("onlineUserIds", getOnlineUserIds());
-
+
// 统计每个用户的连接数
Map<String, Integer> userConnectionCounts = new HashMap<>();
for (Map.Entry<String, Set<Channel>> entry : userConnections.entrySet()) {
userConnectionCounts.put(entry.getKey(), entry.getValue().size());
}
stats.put("userConnectionCounts", userConnectionCounts);
-
+
return stats;
}
}
--
Gitblit v1.7.1