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