package com.supervision.controller; import com.supervision.constant.UserTokenConstant; import com.supervision.websocket.UserResourceCheck; import com.supervision.websocket.WebSocketSessionPool; import com.supervision.websocket.dto.WebSocketLoginDTO; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Component; import javax.websocket.*; import javax.websocket.server.PathParam; import javax.websocket.server.ServerEndpoint; @Component @Slf4j @ServerEndpoint("/webSocket/{uuid}/{userId}") public class WebSocketServer { private static RedisTemplate redisTemplate; private static UserResourceCheck userResourceCheck; // 因为是ServerEndpoint是多例,所以需要这样注入 @Autowired public void setUserResourceCheck(UserResourceCheck userResourceCheck) { WebSocketServer.userResourceCheck = userResourceCheck; } // 因为是ServerEndpoint是多例,所以需要这样注入 @Autowired public void setRedisTemplate(RedisTemplate redisTemplate) { WebSocketServer.redisTemplate = redisTemplate; } /** * 有客户端连接成功 */ @OnOpen public void onOpen(Session session, @PathParam(value = "uuid") String uuid, @PathParam(value = "userId") String userId) { // 校验资源数量,并保存 userResourceCheck.achieveDiagnoseResourceAndOpenConnection(uuid, userId, session); WebSocketSessionPool.SESSION_POOL.put(uuid, session); log.info("用户:{},UUID:{}登录成功", userId, uuid); } /** * 连接关闭调用的方法 */ @OnClose public void onClose(Session session, @PathParam(value = "uuid") String uuid, @PathParam(value = "userId") String userId) { redisTemplate.opsForHash().delete(UserTokenConstant.USER_WEBSOCKET_CACHE, uuid); WebSocketSessionPool.SESSION_POOL.remove(uuid); log.info("用户:{},uuid:{}关闭,从Redis中移除,当前连接数为:{}", userId, uuid, redisTemplate.opsForHash().size(UserTokenConstant.USER_WEBSOCKET_CACHE)); } /** * 发生错误 */ @OnError public void onError(Session session, @PathParam(value = "uuid") String uuid, @PathParam(value = "userId") String userId, Throwable throwable) { redisTemplate.opsForHash().delete(UserTokenConstant.USER_WEBSOCKET_CACHE, uuid); WebSocketSessionPool.SESSION_POOL.remove(uuid); log.error("用户:{},uuid:{}发生错误,从Redis中移除,当前连接数为:{}", userId, uuid, redisTemplate.opsForHash().size(UserTokenConstant.USER_WEBSOCKET_CACHE), throwable); } }