设备数据提送并发问题优化

This commit is contained in:
zzc 2025-01-12 00:59:40 +08:00
parent fa8208d6a5
commit 22fd28c891
3 changed files with 56 additions and 17 deletions

View File

@ -78,7 +78,8 @@ public class WebSocketBusinessHandler implements WebSocketApi {
// EqEquipmentDetailVo data = deviceMsg.getData();
sendMsg = JsonUtils.toJsonString(deviceMsg);
log.info("socket详情发送{}",sendMsg);
sendMsg(sendMsg, userId);
// sendMsg(sendMsg, userId);
sendMsg(sendMsg, Long.valueOf("5"+userId.toString().substring(1)));
}
private void initLanguage(Long userId) {
@ -131,7 +132,8 @@ public class WebSocketBusinessHandler implements WebSocketApi {
}
sendMsg = isTure? JsonUtils.toJsonString(list):sendMsg;
log.info("socket列表发送{}",sendMsg);
sendMsg(sendMsg, userId);
// sendMsg(sendMsg, userId);
sendMsg(sendMsg, Long.valueOf("6"+userId.toString().substring(1)));
}

View File

@ -37,13 +37,23 @@ public class PlusWebSocketHandler extends AbstractWebSocketHandler {
log.info("[connect] invalid token received. sessionId: {}", session.getId());
return;
}
WebSocketSessionHolder.addSession(loginUser.getUserId(), session);
log.info("[connect] sessionId: {},userId:{},userType:{}", session.getId(), loginUser.getUserId(), loginUser.getUserType());
String currentPath = session.getUri().getPath();
Long userId = loginUser.getUserId();
if (currentPath.contains(WebSocketConstants.detail)){
WebSocketSessionHolder.addSession(Long.valueOf("5"+userId.toString().substring(1) ), session);
}else if (currentPath.contains(WebSocketConstants.list)){
WebSocketSessionHolder.addSession(Long.valueOf("6"+userId.toString().substring(1)), session);
}else{
WebSocketSessionHolder.addSession(userId, session);
}
log.info("[connect] sessionId: {},userId:{},userType:{}", session.getId(), userId, loginUser.getUserType());
}
@Autowired
WebSocketApi webSocketApi;
/**
* 处理接收到的文本消息
*
@ -57,10 +67,10 @@ public class PlusWebSocketHandler extends AbstractWebSocketHandler {
log.info("socket接受到消息 {}", message.getPayload());
LoginUser loginUser = (LoginUser) session.getAttributes().get(LOGIN_USER_KEY);
String currentPath = session.getUri().getPath();
String lastPath = WebSocketSessionHolder.getSessions(loginUser.getUserId()).getUri().getPath();
/*String lastPath = WebSocketSessionHolder.getSessions(loginUser.getUserId()).getUri().getPath();
if (!currentPath.equals(lastPath)){
WebSocketSessionHolder.addSession(loginUser.getUserId(), session);
}
}*/
String payload = message.getPayload();
if (currentPath.contains(WebSocketConstants.detail)){
webSocketApi.dealWithDetailMsg(loginUser, payload);
@ -111,7 +121,11 @@ public class PlusWebSocketHandler extends AbstractWebSocketHandler {
*/
@Override
public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {
// 当WebSocket发生传输错误时调用比如网络问题导致连接断开
// 这里可以认为是客户端断开连接因为服务端无法主动抛出传输错误
log.info("websocket连接-网络-客户端断开连接,错误信息:" + exception.getMessage());
log.error("[transport error] sessionId: {} , exception:{}", session.getId(), exception.getMessage());
super.handleTransportError(session, exception);
}
/**
@ -121,14 +135,33 @@ public class PlusWebSocketHandler extends AbstractWebSocketHandler {
* @param status 关闭状态信息
*/
@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus status) {
public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
LoginUser loginUser = (LoginUser) session.getAttributes().get(LOGIN_USER_KEY);
if (ObjectUtil.isNull(loginUser)) {
log.info("[disconnect] invalid token received. sessionId: {}", session.getId());
return;
}
WebSocketSessionHolder.removeSession(loginUser.getUserId());
log.info("[disconnect] sessionId: {},userId:{},userType:{}", session.getId(), loginUser.getUserId(), loginUser.getUserType());
// 当WebSocket连接关闭时调用
if (status.equals(CloseStatus.SERVER_ERROR)) {
// 服务端断开连接比如服务端代码中调用了session.close()
log.info("websocket连接-服务端-断开连接,关闭状态:" + status);
} else {
// 客户端断开连接比如客户端调用了close方法
log.info("websocket连接-客户端-断开连接,关闭状态:" + status);
}
super.afterConnectionClosed(session, status);
String currentPath = session.getUri().getPath();
Long userId = loginUser.getUserId();
if (currentPath.contains(WebSocketConstants.detail)){
WebSocketSessionHolder.removeSession(Long.valueOf("5"+userId.toString().substring(1)));
}else if (currentPath.contains(WebSocketConstants.list)){
WebSocketSessionHolder.removeSession(Long.valueOf("6"+userId.toString().substring(1)));
}else{
WebSocketSessionHolder.removeSession(userId);
}
// WebSocketSessionHolder.removeSession(loginUser.getUserId());
log.info("[disconnect] sessionId: {},userId:{},userType:{}", session.getId(), userId, loginUser.getUserType());
}
/**
@ -141,4 +174,5 @@ public class PlusWebSocketHandler extends AbstractWebSocketHandler {
return false;
}
}

View File

@ -106,7 +106,7 @@ public class WebSocketUtils {
public static void sendMessage(WebSocketSession session, String message) {
sendMessage(session, new TextMessage(message));
}
private static final Object sessionLock = new Object();
/**
* 向指定的WebSocket会话发送WebSocket消息对象
*
@ -114,14 +114,17 @@ public class WebSocketUtils {
* @param message 要发送的WebSocket消息对象
*/
private static void sendMessage(WebSocketSession session, WebSocketMessage<?> message) {
if (session == null || !session.isOpen()) {
log.warn("[send] session会话已经关闭");
} else {
try {
session.sendMessage(message);
} catch (IOException e) {
log.error("[send] session({}) 发送消息({}) 异常", session, message, e);
synchronized (sessionLock) {
if (session == null || !session.isOpen()) {
log.warn("[send] session会话已经关闭");
} else {
try {
session.sendMessage(message);
} catch (IOException e) {
log.error("[send] session({}) 发送消息({}) 异常", session, message, e);
}
}
}
}
}