问诊大厅代码提交
parent
25450fc781
commit
24d943fe43
@ -1,7 +1,8 @@
|
||||
package com.supervision.constant;
|
||||
|
||||
public interface UserTokenConstant {
|
||||
String USER_ID_CACHE = "USER:ID:CACHE";
|
||||
String USER_WEBSOCKET_CACHE = "USER:ID:CACHE";
|
||||
|
||||
String KICK_CHANNEL = "USER:KICK:CHANNEL";
|
||||
|
||||
}
|
||||
|
@ -0,0 +1,45 @@
|
||||
package com.supervision.usermanage;
|
||||
|
||||
import cn.hutool.json.JSONUtil;
|
||||
import com.baomidou.lock.annotation.Lock4j;
|
||||
import com.supervision.constant.UserTokenConstant;
|
||||
import com.supervision.exception.BusinessException;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
|
||||
import javax.websocket.*;
|
||||
import org.springframework.data.redis.core.RedisTemplate;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
@Slf4j
|
||||
@Component
|
||||
@RequiredArgsConstructor
|
||||
public class UserResourceCheck {
|
||||
|
||||
@Value("${human.resourceMaxNumber}")
|
||||
private String resourceNumber;
|
||||
|
||||
private final RedisTemplate<String, String> redisTemplate;
|
||||
|
||||
@Lock4j(name = "achieveDiagnoseResource")
|
||||
public boolean achieveDiagnoseResource() {
|
||||
long humanMaxNumber = Long.parseLong(resourceNumber);
|
||||
long currentSize = redisTemplate.opsForHash().size(UserTokenConstant.USER_WEBSOCKET_CACHE);
|
||||
// 如果小于数字人最大连接数,则可以连接
|
||||
return currentSize < humanMaxNumber;
|
||||
}
|
||||
|
||||
@Lock4j(name = "achieveDiagnoseResourceAndOpenConnection")
|
||||
public void achieveDiagnoseResourceAndOpenConnection(String uid, Session session){
|
||||
// 如果小于数字人最大连接数,则可以连接
|
||||
if (!achieveDiagnoseResource()) {
|
||||
throw new BusinessException("暂时没有资源,建立连接失败");
|
||||
}
|
||||
log.info("用户:{}登录,缓存到Redis", uid);
|
||||
// 链接之前先把之前的用户踢下线(ignoreSessionId防止把当前用户踢下线)
|
||||
// 注意,这里如果用户没有进到问诊页面,只是在问诊大厅时,是不会被踢掉的.(因为这时没有建立websocket连接)
|
||||
redisTemplate.convertAndSend(UserTokenConstant.KICK_CHANNEL, JSONUtil.toJsonStr(new UserWebSocketDTO(uid, session.getId())));
|
||||
redisTemplate.opsForHash().put(UserTokenConstant.USER_WEBSOCKET_CACHE, uid, session.getId());
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue