| | |
| | | |
| | | import java.util.Map; |
| | | import java.util.concurrent.ConcurrentHashMap; |
| | | import java.util.concurrent.Executors; |
| | | import java.util.concurrent.ScheduledExecutorService; |
| | | import java.util.concurrent.TimeUnit; |
| | | import javax.annotation.Resource; |
| | | import javax.websocket.*; |
| | | import javax.websocket.server.PathParam; |
| | |
| | | @Slf4j |
| | | @ServerEndpoint("/websocket/{userId}") |
| | | public class WebSocket { |
| | | |
| | | |
| | | /**线程安全Map*/ |
| | | private static ConcurrentHashMap<String, Session> sessionPool = new ConcurrentHashMap<>(); |
| | | |
| | |
| | | @Resource |
| | | private JeecgRedisClient jeecgRedisClient; |
| | | |
| | | private ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); |
| | | |
| | | //==========【websocket接受、推送消息等方法 —— 具体服务节点推送ws消息】======================================================================================== |
| | | |
| | | @OnOpen |
| | | public void onOpen(Session session, @PathParam(value = "userId") String userId) { |
| | | try { |
| | | sessionPool.put(userId, session); |
| | | log.info("【系统 WebSocket】有新的连接,总数为:" + sessionPool.size()); |
| | | |
| | | // 启动心跳任务,每分钟发送一次心跳消息 |
| | | // scheduler.scheduleAtFixedRate(() -> { |
| | | // pushMessage(userId, "{\"cmd\":\"" + WebsocketConst.CMD_USER + "\",\"txt\":\"" + "心跳响应" + "\"}"); |
| | | // }, 0, 1, TimeUnit.MINUTES); |
| | | |
| | | } catch (Exception e) { |
| | | log.error("【系统 WebSocket】onOpen 异常", e); |
| | | } |
| | | } |
| | | |
| | |
| | | try { |
| | | sessionPool.remove(userId); |
| | | log.info("【系统 WebSocket】连接断开,总数为:" + sessionPool.size()); |
| | | // 取消心跳任务 |
| | | scheduler.shutdown(); |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | | } |
| | |
| | | log.error(e.getMessage(), e); |
| | | } |
| | | } |
| | | log.info("【系统 WebSocket】群发消息:" + message); |
| | | log.info("【3D实时数据 WebSocket】消息" ); |
| | | } catch (Exception e) { |
| | | log.error(e.getMessage(), e); |
| | | } |
| | | } |
| | | |
| | | |
| | | /** |
| | | * ws接受客户端消息 |
| | |
| | | }else{ |
| | | log.debug("【系统 WebSocket】收到客户端消息:" + message); |
| | | } |
| | | |
| | | |
| | | //------------------------------------------------------------------------------ |
| | | JSONObject obj = new JSONObject(); |
| | | //业务类型 |
| | | obj.put(WebsocketConst.MSG_CMD, WebsocketConst.CMD_CHECK); |
| | | //消息内容 |
| | | obj.put(WebsocketConst.MSG_TXT, "心跳响应"); |
| | | this.pushMessage(userId, obj.toJSONString()); |
| | | // JSONObject obj = new JSONObject(); |
| | | // //业务类型 |
| | | // obj.put(WebsocketConst.MSG_CMD, WebsocketConst.CMD_CHECK); |
| | | // //消息内容 |
| | | // obj.put(WebsocketConst.MSG_TXT, "心跳响应"); |
| | | // this.pushMessage(userId, obj.toJSONString()); |
| | | //------------------------------------------------------------------------------ |
| | | } |
| | | |
| | |
| | | */ |
| | | @OnError |
| | | public void onError(Session session, Throwable t) { |
| | | log.warn("【系统 WebSocket】消息出现错误"); |
| | | log.warn("【系统 WebSocket】消息出现错误",t); |
| | | //t.printStackTrace(); |
| | | } |
| | | //==========【系统 WebSocket接受、推送消息等方法 —— 具体服务节点推送ws消息】======================================================================================== |
| | | |
| | | |
| | | |
| | | //==========【采用redis发布订阅模式——推送消息】======================================================================================== |
| | | /** |
| | |
| | | } |
| | | } |
| | | //=======【采用redis发布订阅模式——推送消息】========================================================================================== |
| | | |
| | | |
| | | } |