From 23855599412c4d61b38d78f0f3abd3430a48b5b1 Mon Sep 17 00:00:00 2001 From: zhangherong <571457620@qq.com> Date: 星期三, 25 六月 2025 11:51:38 +0800 Subject: [PATCH] Merge branch 'mdc_hyjs_master' --- lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/message/websocket/WebSocket.java | 204 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 204 insertions(+), 0 deletions(-) diff --git a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/message/websocket/WebSocket.java b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/message/websocket/WebSocket.java new file mode 100644 index 0000000..35d7d6d --- /dev/null +++ b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/message/websocket/WebSocket.java @@ -0,0 +1,204 @@ +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: 姝ゆ敞瑙g浉褰撲簬璁剧疆璁块棶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); + + //==========銆恮ebsocket鎺ュ彈銆佹帹閫佹秷鎭瓑鏂规硶 鈥斺�� 鍏蜂綋鏈嶅姟鑺傜偣鎺ㄩ�亀s娑堟伅銆�======================================================================================== + + @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銆憃nOpen 寮傚父", 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鐨刴d5涓瞹 + //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鎺ュ彈銆佹帹閫佹秷鎭瓑鏂规硶 鈥斺�� 鍏蜂綋鏈嶅姟鑺傜偣鎺ㄩ�亀s娑堟伅銆�======================================================================================== + + + //==========銆愰噰鐢╮edis鍙戝竷璁㈤槄妯″紡鈥斺�旀帹閫佹秷鎭��======================================================================================== + /** + * 鍚庡彴鍙戦�佹秷鎭埌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("銆恮ebsocket娑堟伅銆� 鍗曠偣娑堟伅:"+message); + session.getAsyncRemote().sendText(message); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + //=======銆愰噰鐢╮edis鍙戝竷璁㈤槄妯″紡鈥斺�旀帹閫佹秷鎭��========================================================================================== + +} \ No newline at end of file -- Gitblit v1.9.3