From 2166c1a14f9629aa49a5f3bb849ce878df4c4892 Mon Sep 17 00:00:00 2001
From: yangbin <yangbin@qq.com>
Date: 星期三, 28 八月 2024 17:23:25 +0800
Subject: [PATCH] 2

---
 lxzn-module-ai/src/main/java/org/jeecg/modules/ai/websocket/AiWebSocket.java |  191 +++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 191 insertions(+), 0 deletions(-)

diff --git a/lxzn-module-ai/src/main/java/org/jeecg/modules/ai/websocket/AiWebSocket.java b/lxzn-module-ai/src/main/java/org/jeecg/modules/ai/websocket/AiWebSocket.java
new file mode 100644
index 0000000..a08bd9a
--- /dev/null
+++ b/lxzn-module-ai/src/main/java/org/jeecg/modules/ai/websocket/AiWebSocket.java
@@ -0,0 +1,191 @@
+package org.jeecg.modules.ai.websocket;
+
+import com.alibaba.fastjson.JSONObject;
+import lombok.extern.slf4j.Slf4j;
+import org.jeecg.common.base.BaseMap;
+import org.jeecg.common.constant.WebsocketConst;
+import org.jeecg.common.modules.redis.client.JeecgRedisClient;
+import org.jeecg.modules.ai.service.IWebSocketAiService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import javax.websocket.*;
+import javax.websocket.server.PathParam;
+import javax.websocket.server.ServerEndpoint;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * @author clown
+ * * @date 2024/8/8
+ */
+@Component
+@Slf4j
+@ServerEndpoint("/websocket/ai/{userId}")
+public class AiWebSocket {
+    /**绾跨▼瀹夊叏Map*/
+    private static ConcurrentHashMap<String, Session> sessionPoolAi = new ConcurrentHashMap<>();
+    /**
+     * Redis瑙﹀彂鐩戝惉鍚嶅瓧
+     */
+    public static final String REDIS_TOPIC_NAME_AI = "websocketAiHandler";
+    @Resource
+    private JeecgRedisClient jeecgRedisClient;
+
+    public static Map<String, Session> getSessionPoolAi() {
+        return sessionPoolAi;
+    }
+    //==========銆恮ebsocket鎺ュ彈銆佹帹閫佹秷鎭瓑鏂规硶 鈥斺�� 鍏蜂綋鏈嶅姟鑺傜偣鎺ㄩ�亀s娑堟伅銆�========================================================================================
+    @OnOpen
+    public void onOpen(Session session, @PathParam(value = "userId") String userId) {
+        try {
+            sessionPoolAi.put(userId, session);
+            log.info("銆愮郴缁� WebSocket銆戞湁鏂扮殑杩炴帴锛屾�绘暟涓�:" + sessionPoolAi.size());
+        } catch (Exception e) {
+        }
+    }
+
+    @OnClose
+    public void onClose(@PathParam("userId") String userId) {
+        try {
+            sessionPoolAi.remove(userId);
+            log.info("銆愮郴缁� WebSocket銆戣繛鎺ユ柇寮�锛屾�绘暟涓�:" + sessionPoolAi.size());
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * ws鎺ㄩ�佹秷鎭�
+     *
+     * @param userId
+     * @param message
+     */
+    public static void pushMessage(String userId, String message) {
+
+        Session session = sessionPoolAi.get(userId);
+        if (session != null && session.isOpen()) {
+            try {
+                //update-begin-author:taoyan date:20211012 for: websocket鎶ラ敊 https://gitee.com/jeecg/jeecg-boot/issues/I4C0MU
+                synchronized (session){
+                    session.getBasicRemote().sendText(message);
+                }
+                //update-end-author:taoyan date:20211012 for: websocket鎶ラ敊 https://gitee.com/jeecg/jeecg-boot/issues/I4C0MU
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+
+        /*for (Map.Entry<String, Session> item : sessionPoolAi.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 : sessionPoolAi.entrySet()) {
+                try {
+                    item.getValue().getAsyncRemote().sendText(message);
+                } catch (Exception e) {
+                    log.error(e.getMessage(), e);
+                }
+            }
+            log.info("銆愮郴缁� WebSocket銆戠兢鍙戞秷鎭�:" + message);
+        } 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, "蹇冭烦鍝嶅簲");*/
+        /*webSocketAiService.selectChatIA(message);*/
+        /*this.pushMessage(userId, obj.toJSONString());*/
+
+    }
+
+    /**
+     * 閰嶇疆閿欒淇℃伅澶勭悊
+     *
+     * @param session
+     * @param t
+     */
+    @OnError
+    public void onError(Session session, Throwable t) {
+        log.warn("銆愮郴缁� WebSocket銆戞秷鎭嚭鐜伴敊璇�");
+        //t.printStackTrace();
+    }
+    //==========銆愮郴缁� WebSocket鎺ュ彈銆佹帹閫佹秷鎭瓑鏂规硶 鈥斺�� 鍏蜂綋鏈嶅姟鑺傜偣鎺ㄩ�亀s娑堟伅銆�========================================================================================
+
+
+    //==========銆愰噰鐢╮edis鍙戝竷璁㈤槄妯″紡鈥斺�旀帹閫佹秷鎭��========================================================================================
+    /**
+     * 鍚庡彴鍙戦�佹秷鎭埌redis
+     *
+     * @param message
+     */
+    public void sendMessage(String message) {
+        BaseMap baseMap = new BaseMap();
+        baseMap.put("userId", "");
+        baseMap.put("message", message);
+        jeecgRedisClient.sendMessage(REDIS_TOPIC_NAME_AI, baseMap);
+    }
+
+    /**
+     * 姝や负鍗曠偣娑堟伅 redis
+     *
+     * @param userId
+     * @param message
+     */
+    public void sendMessage(String userId, String message) {
+        BaseMap baseMap = new BaseMap();
+        jeecgRedisClient.sendMessage(REDIS_TOPIC_NAME_AI, baseMap);
+    }
+
+    /**
+     * 姝や负鍗曠偣娑堟伅(澶氫汉) redis
+     *
+     * @param userIds
+     * @param message
+     */
+    public void sendMessage(String[] userIds, String message) {
+
+    }
+
+    // 姝や负鍗曠偣娑堟伅
+    public void sendOneMessage(String userId, String message) {
+
+    }
+
+}

--
Gitblit v1.9.3