package org.dromara.common.websocket.holder; import lombok.AccessLevel; import lombok.NoArgsConstructor; import org.springframework.web.socket.CloseStatus; import org.springframework.web.socket.WebSocketSession; import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; /** * WebSocketSession 用于保存当前所有在线的会话信息 * * @author zendwang */ @NoArgsConstructor(access = AccessLevel.PRIVATE) public class WebSocketSessionHolder { private static final Map USER_SESSION_MAP = new ConcurrentHashMap<>(); /** * 将WebSocket会话添加到用户会话Map中 * * @param sessionKey 会话键,用于检索会话 * @param session 要添加的WebSocket会话 */ public static void addSession(Long sessionKey, WebSocketSession session) { removeSession(sessionKey); USER_SESSION_MAP.put(sessionKey, session); } /** * 从用户会话Map中移除指定会话键对应的WebSocket会话 * * @param sessionKey 要移除的会话键 */ public static void removeSession(Long sessionKey) { WebSocketSession session = USER_SESSION_MAP.remove(sessionKey); try { session.close(CloseStatus.BAD_DATA); } catch (Exception ignored) { } } /** * 根据会话键从用户会话Map中获取WebSocket会话 * * @param sessionKey 要获取的会话键 * @return 与给定会话键对应的WebSocket会话,如果不存在则返回null */ public static WebSocketSession getSessions(Long sessionKey) { return USER_SESSION_MAP.get(sessionKey); } /** * 获取存储在用户会话Map中所有WebSocket会话的会话键集合 * * @return 所有WebSocket会话的会话键集合 */ public static Set getSessionsAll() { return USER_SESSION_MAP.keySet(); } /** * 检查给定的会话键是否存在于用户会话Map中 * * @param sessionKey 要检查的会话键 * @return 如果存在对应的会话键,则返回true;否则返回false */ public static Boolean existSession(Long sessionKey) { return USER_SESSION_MAP.containsKey(sessionKey); } }