|
|
|
@ -26,7 +26,9 @@ import org.springframework.stereotype.Component; |
|
|
|
public class WebSocketServer { |
|
|
|
|
|
|
|
private static Logger logger = LoggerFactory.getLogger(WebSocketServer.class); |
|
|
|
|
|
|
|
|
|
|
|
private final Map<String, Object> sessionSendLocks = new ConcurrentHashMap<>(); |
|
|
|
|
|
|
|
/** |
|
|
|
* 静态变量,用来记录当前在线连接数,线程安全的类。 |
|
|
|
*/ |
|
|
|
@ -143,19 +145,18 @@ public class WebSocketServer { |
|
|
|
// logger.info("服务端给客户端发送消息 ==> toSid = {}, message = {}", toUid, message);
|
|
|
|
// toSession.getAsyncRemote().sendText(message);
|
|
|
|
// 异步发送
|
|
|
|
try { |
|
|
|
logger.info("服务端给客户端发送消息 ==> toSid = {}, message = {}", toUid, message); |
|
|
|
|
|
|
|
// 确保 WebSocket 状态正常
|
|
|
|
if (toSession.isOpen()) { |
|
|
|
// 每个 Session 一个锁
|
|
|
|
Object lock = sessionSendLocks.computeIfAbsent( |
|
|
|
toUid, k -> new Object() |
|
|
|
); |
|
|
|
|
|
|
|
synchronized (lock) { |
|
|
|
try { |
|
|
|
logger.info("服务端给客户端发送消息 ==> toSid = {}, message = {}", toUid, message); |
|
|
|
toSession.getAsyncRemote().sendText(message); |
|
|
|
} else { |
|
|
|
logger.warn("WebSocket 状态不正常,不能发送消息 ==> toSid = {}", toUid); |
|
|
|
} catch (Exception e) { |
|
|
|
logger.error("发送消息失败 ==> toSid = {}, message = {}", toUid, message, e); |
|
|
|
} |
|
|
|
} catch (IllegalStateException e) { |
|
|
|
logger.error("发送消息时出现错误 ==> toSid = {}, message = {}", toUid, message, e); |
|
|
|
} catch (Exception e) { |
|
|
|
logger.error("发送消息时出现未知错误 ==> toSid = {}, message = {}", toUid, message, e); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|