背景:在执行任务的时候同步进度条任务进度
报错内容:
报错原因:
异步线程中,在某一时刻同一个session会被多个线程同时访问。
解决方式:加同步锁
getBasicRemote 同步发送消息
getAsyncRemote 异步发送消息
// 单点消息
public static void sendOneMessage(String userId, WebSocketMessage webSocketMessage) {
String data = JSON.toJSONString(webSocketMessage);
ConcurrentHashMap<String, Session> sessionMap = SESSION_POOL.get(userId);
for (Map.Entry<String, Session> map : sessionMap.entrySet()) {
Session session = map.getValue();
if (session != null && session.isOpen()) {
log.info("【websocket消息】 单点消息: {}", data);
synchronized (session) {
try {
session.getBasicRemote().sendText(data);
} catch (IOException e) {
session.getAsyncRemote().sendText(data);
}
}
}
}
}