|
@@ -4,15 +4,13 @@ import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
|
|
import com.zanxiang.erp.base.pojo.TokenInfo;
|
|
|
import com.zanxiang.erp.security.util.SecurityUtil;
|
|
|
import com.zanxiang.game.module.manage.constant.RedisKeyConstant;
|
|
|
-import com.zanxiang.game.module.manage.enums.KfOperateEnum;
|
|
|
-import com.zanxiang.game.module.manage.enums.KfRoomMsgOwnerEnum;
|
|
|
-import com.zanxiang.game.module.manage.enums.KfRoomMsgTypeEnum;
|
|
|
-import com.zanxiang.game.module.manage.enums.KfWebSocketMsgEnum;
|
|
|
+import com.zanxiang.game.module.manage.enums.*;
|
|
|
import com.zanxiang.game.module.manage.pojo.dto.KfWebSocketMsgDTO;
|
|
|
import com.zanxiang.game.module.manage.pojo.params.KfWebSocketMsgParam;
|
|
|
import com.zanxiang.game.module.manage.service.*;
|
|
|
import com.zanxiang.game.module.manage.service.api.KfWxApiService;
|
|
|
import com.zanxiang.game.module.manage.utils.FileUtil;
|
|
|
+import com.zanxiang.game.module.manage.utils.RedisUtil;
|
|
|
import com.zanxiang.game.module.mybatis.entity.KfRoom;
|
|
|
import com.zanxiang.game.module.mybatis.entity.KfRoomMsg;
|
|
|
import com.zanxiang.game.module.mybatis.entity.KfSessionUser;
|
|
@@ -33,7 +31,6 @@ import java.util.HashMap;
|
|
|
import java.util.List;
|
|
|
import java.util.Map;
|
|
|
import java.util.Objects;
|
|
|
-import java.util.concurrent.TimeUnit;
|
|
|
|
|
|
/**
|
|
|
* @author : lingfeng
|
|
@@ -69,6 +66,9 @@ public class KfMsgWebsocketHandler implements WebSocketHandler {
|
|
|
@Autowired
|
|
|
private IKfQuickReplyService kfQuickReplyService;
|
|
|
|
|
|
+ @Autowired
|
|
|
+ private RedisUtil<String> redisUtil;
|
|
|
+
|
|
|
@Autowired
|
|
|
private RedisTemplate<String, String> redisTemplate;
|
|
|
|
|
@@ -328,11 +328,12 @@ public class KfMsgWebsocketHandler implements WebSocketHandler {
|
|
|
.roomList(onlineRoomList)
|
|
|
.build());
|
|
|
//以防锁依然存在, 尝试释放锁, 锁如果不存在, 会抛出异常, 直接捕获不处理
|
|
|
+ String lockKey = RedisKeyConstant.KF_MSG_USER_CONNECT_JOIN + kfRoom.getOpenId();
|
|
|
try {
|
|
|
- log.error("结束会话释放锁, key : {}", RedisKeyConstant.KF_MSG_USER_CONNECT_JOIN + kfRoom.getOpenId());
|
|
|
- distributedLockComponent.unlock(RedisKeyConstant.KF_MSG_USER_CONNECT_JOIN + kfRoom.getOpenId());
|
|
|
+ log.error("结束会话释放锁, key : {}", lockKey);
|
|
|
+ redisUtil.deleteCache(lockKey);
|
|
|
} catch (Exception e) {
|
|
|
- log.error("结束会话释放锁异常, key : {}, e : {}", RedisKeyConstant.KF_MSG_USER_CONNECT_JOIN + kfRoom.getOpenId(), e.getMessage());
|
|
|
+ log.error("结束会话释放锁异常, key : {}, e : {}", lockKey, e.getMessage());
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -390,15 +391,15 @@ public class KfMsgWebsocketHandler implements WebSocketHandler {
|
|
|
//玩家信息, 判断玩家是否已经被接入
|
|
|
KfSessionUser kfSessionUser = kfSessionUserService.getById(param.getOpenId());
|
|
|
if (!kfSessionUser.getIsWait()) {
|
|
|
- this.sendMessage(session, KfWebSocketMsgDTO.fail(param.getWebSocketMsgType(), "玩家已被其他客服接入, 非待接入状态"));
|
|
|
+ this.sendMessage(session, KfWebSocketMsgDTO.fail(param.getWebSocketMsgType(), "玩家非待接入状态(已被其他客服接入)"));
|
|
|
return;
|
|
|
}
|
|
|
//触发玩家接入线程锁
|
|
|
- log.error("玩家接入触发线程锁, key : {}", RedisKeyConstant.KF_MSG_USER_CONNECT_JOIN + param.getOpenId());
|
|
|
- if (!distributedLockComponent.doLock(RedisKeyConstant.KF_MSG_USER_CONNECT_JOIN + param.getOpenId(),
|
|
|
- 0L, 3L, TimeUnit.MINUTES)) {
|
|
|
- log.error("玩家接入线程锁, 锁定中, key : {}", RedisKeyConstant.KF_MSG_USER_CONNECT_JOIN + param.getOpenId());
|
|
|
- this.sendMessage(session, KfWebSocketMsgDTO.fail(param.getWebSocketMsgType(), "玩家已被其他客服接入"));
|
|
|
+ String lockKey = RedisKeyConstant.KF_MSG_USER_CONNECT_JOIN + param.getOpenId();
|
|
|
+ log.error("玩家接入触发线程锁, key : {}", lockKey);
|
|
|
+ if (!redisUtil.setIfAbsent(lockKey, lockKey, ExpireTimeEnum.FIVE_MIN.getTime())) {
|
|
|
+ log.error("玩家接入锁碰撞, 未接入成功, key : {}", lockKey);
|
|
|
+ this.sendMessage(session, KfWebSocketMsgDTO.fail(param.getWebSocketMsgType(), "玩家非待接入状态,(其他客服已抢先接入)"));
|
|
|
return;
|
|
|
}
|
|
|
//玩家更新为已接入
|