¶Ô±ÈÐÂÎļþ |
| | |
| | | package org.jeecg.modules.message.websocket; |
| | | |
| | | 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; |
| | | import javax.websocket.server.ServerEndpoint; |
| | | |
| | | import com.alibaba.fastjson.JSONObject; |
| | | import org.jeecg.common.base.BaseMap; |
| | | import org.jeecg.common.constant.WebsocketConst; |
| | | import org.jeecg.common.modules.redis.client.JeecgRedisClient; |
| | | import org.springframework.stereotype.Component; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | |
| | | /** |
| | | * @Author scott |
| | | * @Date 2019/11/29 9:41 |
| | | * @Description: æ¤æ³¨è§£ç¸å½äºè®¾ç½®è®¿é®URL |
| | | */ |
| | | @Component |
| | | @Slf4j |
| | | @ServerEndpoint("/websocket/{userId}") |
| | | public class WebSocket { |
| | | |
| | | /**线ç¨å®å
¨Map*/ |
| | | private static ConcurrentHashMap<String, Session> sessionPool = new ConcurrentHashMap<>(); |
| | | |
| | | /** |
| | | * Redis触åçå¬åå |
| | | */ |
| | | public static final String REDIS_TOPIC_NAME = "socketHandler"; |
| | | @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); |
| | | } |
| | | } |
| | | |
| | | @OnClose |
| | | public void onClose(@PathParam("userId") String userId) { |
| | | try { |
| | | sessionPool.remove(userId); |
| | | log.info("ãç³»ç» WebSocketãè¿æ¥æå¼ï¼æ»æ°ä¸º:" + sessionPool.size()); |
| | | // åæ¶å¿è·³ä»»å¡ |
| | | scheduler.shutdown(); |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * wsæ¨éæ¶æ¯ |
| | | * |
| | | * @param userId |
| | | * @param message |
| | | */ |
| | | public void pushMessage(String userId, String message) { |
| | | for (Map.Entry<String, Session> item : sessionPool.entrySet()) { |
| | | //userId keyå¼= {ç¨æ·id + "_"+ ç»å½tokençmd5串} |
| | | //TODO vue2æªæ¹keyæ°è§åï¼ææ¶ä¸å½±åé»è¾ |
| | | if (item.getKey().contains(userId)) { |
| | | Session session = item.getValue(); |
| | | try { |
| | | //update-begin-author:taoyan date:20211012 for: websocketæ¥é https://gitee.com/jeecg/jeecg-boot/issues/I4C0MU |
| | | synchronized (session){ |
| | | log.info("ãç³»ç» WebSocketãæ¨éåäººæ¶æ¯:" + message); |
| | | session.getBasicRemote().sendText(message); |
| | | } |
| | | //update-end-author:taoyan date:20211012 for: websocketæ¥é https://gitee.com/jeecg/jeecg-boot/issues/I4C0MU |
| | | } catch (Exception e) { |
| | | log.error(e.getMessage(),e); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * wséåç¾¤åæ¶æ¯ |
| | | */ |
| | | public void pushMessage(String message) { |
| | | try { |
| | | for (Map.Entry<String, Session> item : sessionPool.entrySet()) { |
| | | try { |
| | | item.getValue().getAsyncRemote().sendText(message); |
| | | } catch (Exception e) { |
| | | log.error(e.getMessage(), e); |
| | | } |
| | | } |
| | | log.info("ã3D宿¶æ°æ® WebSocketãæ¶æ¯" ); |
| | | } catch (Exception e) { |
| | | log.error(e.getMessage(), e); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * wsæ¥å客æ·ç«¯æ¶æ¯ |
| | | */ |
| | | @OnMessage |
| | | public void onMessage(String message, @PathParam(value = "userId") String userId) { |
| | | if(!"ping".equals(message) && !WebsocketConst.CMD_CHECK.equals(message)){ |
| | | log.info("ãç³»ç» WebSocketãæ¶å°å®¢æ·ç«¯æ¶æ¯:" + message); |
| | | }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()); |
| | | //------------------------------------------------------------------------------ |
| | | } |
| | | |
| | | /** |
| | | * é
ç½®é误信æ¯å¤ç |
| | | * |
| | | * @param session |
| | | * @param t |
| | | */ |
| | | @OnError |
| | | public void onError(Session session, Throwable t) { |
| | | log.warn("ãç³»ç» WebSocketãæ¶æ¯åºç°é误",t); |
| | | //t.printStackTrace(); |
| | | } |
| | | //==========ãç³»ç» WebSocketæ¥åãæ¨éæ¶æ¯çæ¹æ³ ââ å
·ä½æå¡èç¹æ¨éwsæ¶æ¯ã======================================================================================== |
| | | |
| | | |
| | | //==========ãéç¨redisåå¸è®¢é
模å¼ââæ¨éæ¶æ¯ã======================================================================================== |
| | | /** |
| | | * åå°åéæ¶æ¯å°redis |
| | | * |
| | | * @param message |
| | | */ |
| | | public void sendMessage(String message) { |
| | | //log.info("ãç³»ç» WebSocketãå¹¿ææ¶æ¯:" + message); |
| | | BaseMap baseMap = new BaseMap(); |
| | | baseMap.put("userId", ""); |
| | | baseMap.put("message", message); |
| | | jeecgRedisClient.sendMessage(REDIS_TOPIC_NAME, baseMap); |
| | | } |
| | | |
| | | /** |
| | | * æ¤ä¸ºåç¹æ¶æ¯ redis |
| | | * |
| | | * @param userId |
| | | * @param message |
| | | */ |
| | | public void sendMessage(String userId, String message) { |
| | | BaseMap baseMap = new BaseMap(); |
| | | baseMap.put("userId", userId); |
| | | baseMap.put("message", message); |
| | | jeecgRedisClient.sendMessage(REDIS_TOPIC_NAME, baseMap); |
| | | } |
| | | |
| | | /** |
| | | * æ¤ä¸ºåç¹æ¶æ¯(å¤äºº) redis |
| | | * |
| | | * @param userIds |
| | | * @param message |
| | | */ |
| | | public void sendMessage(String[] userIds, String message) { |
| | | for (String userId : userIds) { |
| | | sendMessage(userId, message); |
| | | } |
| | | } |
| | | |
| | | // æ¤ä¸ºåç¹æ¶æ¯ |
| | | public void sendOneMessage(String userId, String message) { |
| | | Session session = sessionPool.get(userId); |
| | | if (session != null&&session.isOpen()) { |
| | | try { |
| | | log.info("ãwebsocketæ¶æ¯ã åç¹æ¶æ¯:"+message); |
| | | session.getAsyncRemote().sendText(message); |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | | } |
| | | } |
| | | } |
| | | //=======ãéç¨redisåå¸è®¢é
模å¼ââæ¨éæ¶æ¯ã========================================================================================== |
| | | |
| | | } |