提交websocket相关代码

dev_2.0.0
liu
parent b5377bb305
commit f1aeb1eeb7

@ -5,4 +5,6 @@ public interface UserTokenConstant {
String KICK_CHANNEL = "USER:KICK:CHANNEL"; String KICK_CHANNEL = "USER:KICK:CHANNEL";
Integer KICK_CODE = 10000;
} }

@ -12,6 +12,7 @@ import com.supervision.pojo.vo.UserInfoReqVo;
import com.supervision.pojo.vo.UserInfoResVo; import com.supervision.pojo.vo.UserInfoResVo;
import com.supervision.service.UserManageService; import com.supervision.service.UserManageService;
import com.supervision.service.UserService; import com.supervision.service.UserService;
import com.supervision.usermanage.UserWebSocketDTO;
import com.supervision.usermanage.UserResourceCheck; import com.supervision.usermanage.UserResourceCheck;
import com.supervision.util.TokenUtil; import com.supervision.util.TokenUtil;
import com.supervision.util.UserUtil; import com.supervision.util.UserUtil;
@ -63,7 +64,7 @@ public class UserController {
@ApiOperation("踢用户下线") @ApiOperation("踢用户下线")
@GetMapping("kickUser") @GetMapping("kickUser")
public void kickUser(String userId) { public void kickUser(String userId) {
redisTemplate.convertAndSend(UserTokenConstant.KICK_CHANNEL, userId); redisTemplate.convertAndSend(UserTokenConstant.KICK_CHANNEL, JSONUtil.toJsonStr(new UserWebSocketDTO(userId, null)));
} }
@ApiOperation("查看资源是否有剩余") @ApiOperation("查看资源是否有剩余")

@ -29,11 +29,12 @@ public class WebSocketServer {
private static UserResourceCheck userResourceCheck ; private static UserResourceCheck userResourceCheck ;
// 因为是ServerEndpoint是多例,所以需要这样注入
@Autowired @Autowired
public void setUserResourceCheck(UserResourceCheck userResourceCheck) { public void setUserResourceCheck(UserResourceCheck userResourceCheck) {
WebSocketServer.userResourceCheck = userResourceCheck; WebSocketServer.userResourceCheck = userResourceCheck;
} }
// 因为是ServerEndpoint是多例,所以需要这样注入
@Autowired @Autowired
public void setRedisTemplate(RedisTemplate<String, String> redisTemplate) { public void setRedisTemplate(RedisTemplate<String, String> redisTemplate) {
WebSocketServer.redisTemplate = redisTemplate; WebSocketServer.redisTemplate = redisTemplate;

@ -7,6 +7,7 @@ import com.baomidou.lock.annotation.Lock4j;
import com.supervision.constant.UserTokenConstant; import com.supervision.constant.UserTokenConstant;
import com.supervision.controller.WebSocketServer; import com.supervision.controller.WebSocketServer;
import com.supervision.exception.BusinessException; import com.supervision.exception.BusinessException;
import lombok.Data;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
@ -43,23 +44,33 @@ public class UserResourceCheck {
} }
log.info("用户:{}开始登录,缓存到Redis,并尝试把该用户已有客户端踢下线", uid); log.info("用户:{}开始登录,缓存到Redis,并尝试把该用户已有客户端踢下线", uid);
// 链接之前先把之前的用户踢下线(ignoreSessionId防止把当前用户踢下线) // 链接之前先把之前的用户踢下线(ignoreSessionId防止把当前用户踢下线)
// 注意,这里如果用户没有进到问诊页面,只是在问诊大厅时,是不会被踢掉的.(因为这时没有建立websocket连接) // 注意,这里如果用户没有进到问诊页面,只是在问诊大厅时,是不会被踢掉的.(因为这时没有建立websocket连接,还没与放到SESSION_POOL里面去)
redisTemplate.convertAndSend(UserTokenConstant.KICK_CHANNEL, JSONUtil.toJsonStr(new UserWebSocketDTO(uid, session.getId()))); redisTemplate.convertAndSend(UserTokenConstant.KICK_CHANNEL, JSONUtil.toJsonStr(new UserWebSocketDTO(uid, session.getId())));
log.info("尝试踢该用户{}的其他session下线,忽略sessionId:{}",uid,session.getId());
redisTemplate.opsForHash().put(UserTokenConstant.USER_WEBSOCKET_CACHE, uid, session.getId()); redisTemplate.opsForHash().put(UserTokenConstant.USER_WEBSOCKET_CACHE, uid, session.getId());
} }
// 实现一个方法用于踢下线用户,走的是Redis的消息队列 // 实现一个方法用于踢下线用户,走的是Redis的消息队列
public void kickUser(String userId, String ignoreSessionId) throws IOException { public void kickUser(String userId, String ignoreSessionId) throws IOException {
log.info("尝试主动踢用户:{}下线", userId); log.info("尝试踢用户:{}下线", userId);
Session session = WebSocketServer.SESSION_POOL.get(userId); Session session = WebSocketServer.SESSION_POOL.get(userId);
// 只有不是忽略剔除的sessionId才可以踢下线 // 只有不是忽略剔除的sessionId才可以踢下线
if (ObjectUtil.isNotEmpty(session) && !StrUtil.equals(ignoreSessionId, session.getId())) { if (ObjectUtil.isNotEmpty(session) && !StrUtil.equals(ignoreSessionId, session.getId())) {
session.getBasicRemote().sendText(JSONUtil.toJsonStr(new Kick()));
session.close(new CloseReason(CloseReason.CloseCodes.NORMAL_CLOSURE, "用户被踢下线")); session.close(new CloseReason(CloseReason.CloseCodes.NORMAL_CLOSURE, "用户被踢下线"));
WebSocketServer.SESSION_POOL.remove(userId); WebSocketServer.SESSION_POOL.remove(userId);
log.info("主动踢用户:{},sessionId:{} 下线成功", userId, session.getId()); log.info("踢用户:{},sessionId:{} 下线成功", userId, session.getId());
return; return;
} }
log.info("主动踢用户:{}下线,未找到用户,踢下线失败", userId); log.info("踢用户:{}下线,未找到用户,踢下线失败", userId);
}
@Data
public static class Kick {
private final Integer code = UserTokenConstant.KICK_CODE;
private final String message = "用户被踢下线";
} }
} }

Loading…
Cancel
Save