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