|
@@ -0,0 +1,149 @@
|
|
|
+package com.persagy.apm.energyalarmstarter.collectdata.websocket;
|
|
|
+
|
|
|
+import org.apache.commons.lang3.StringUtils;
|
|
|
+
|
|
|
+import javax.websocket.Session;
|
|
|
+import java.util.HashSet;
|
|
|
+import java.util.Map;
|
|
|
+import java.util.Set;
|
|
|
+import java.util.concurrent.ConcurrentHashMap;
|
|
|
+import java.util.concurrent.CopyOnWriteArraySet;
|
|
|
+
|
|
|
+/**
|
|
|
+ * @description: webSocket缓存,存储通信session
|
|
|
+ * @author: lixing
|
|
|
+ * @company: Persagy Technology Co.,Ltd
|
|
|
+ * @since: 2020/11/30 7:07 下午
|
|
|
+ * @version: V1.0
|
|
|
+ */
|
|
|
+public class AlarmWebSocketCache {
|
|
|
+ /**
|
|
|
+ * 所有项目的标志
|
|
|
+ */
|
|
|
+ public static final String allProjects = "allProjects";
|
|
|
+ /**
|
|
|
+ * 所有在线的客户端
|
|
|
+ */
|
|
|
+ private static Map<String, Session> clients = new ConcurrentHashMap<>();
|
|
|
+
|
|
|
+ /**
|
|
|
+ * @description: 根据项目获取通道
|
|
|
+ * @param: projectId
|
|
|
+ * @return: java.util.Set<java.lang.String>
|
|
|
+ * @exception:
|
|
|
+ * @author: lixing
|
|
|
+ * @company: Persagy Technology Co.,Ltd
|
|
|
+ * @since: 2020/12/3 2:56 下午
|
|
|
+ * @version: V1.0
|
|
|
+ */
|
|
|
+ public static Set<String> getProjectSessionIds(String projectId) {
|
|
|
+ // 如果多个边缘端配置的projectId有重复,这里不知道报警定义到底发送到了哪个边缘端,所以这里发消息要发给所有边缘端。
|
|
|
+ Set<String> resultSet = new HashSet<>();
|
|
|
+ synchronized (resultSet) {
|
|
|
+ // 结果集中一定包含接收所有项目消息的通道
|
|
|
+ if (projectSessionIds.get(AlarmWebSocketCache.allProjects) != null) {
|
|
|
+ resultSet.addAll(projectSessionIds.get(AlarmWebSocketCache.allProjects));
|
|
|
+ }
|
|
|
+ if (StringUtils.isNotEmpty(projectId)) {
|
|
|
+ if (projectSessionIds.get(projectId) != null) {
|
|
|
+ resultSet.addAll(projectSessionIds.get(projectId));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return resultSet;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 所有在线的客户端
|
|
|
+ * projectId:<sessionId1,sessionId2>
|
|
|
+ */
|
|
|
+ private static Map<String, Set<String>> projectSessionIds = new ConcurrentHashMap<>();
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取连接中的所有客户端
|
|
|
+ *
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public static Session getClient(String sessionId) {
|
|
|
+ return clients.get(sessionId);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取连接中的所有客户端
|
|
|
+ *
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public static Map<String, Session> getClients() {
|
|
|
+ return clients;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 增加客户端
|
|
|
+ *
|
|
|
+ * @param session
|
|
|
+ */
|
|
|
+ public static void addClient(String projectIdStr, Session session) {
|
|
|
+ if (StringUtils.isEmpty(projectIdStr)) {
|
|
|
+ addProjectSessionId(allProjects, session.getId());
|
|
|
+ } else {
|
|
|
+ String[] projectIds = projectIdStr.split(",");
|
|
|
+ for (String projectId : projectIds) {
|
|
|
+ addProjectSessionId(projectId, session.getId());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ clients.put(session.getId(), session);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * @description: 将sessionId添加到项目下
|
|
|
+ * @param: projectId
|
|
|
+ * @param: session
|
|
|
+ * @return: void
|
|
|
+ * @exception:
|
|
|
+ * @author: lixing
|
|
|
+ * @company: Persagy Technology Co.,Ltd
|
|
|
+ * @since: 2020/12/2 6:25 下午
|
|
|
+ * @version: V1.0
|
|
|
+ */
|
|
|
+ private static void addProjectSessionId(String projectId, String sessionId) {
|
|
|
+ Set<String> sessionIds = projectSessionIds.getOrDefault(projectId, new CopyOnWriteArraySet());
|
|
|
+ sessionIds.add(sessionId);
|
|
|
+ projectSessionIds.put(projectId, sessionIds);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * @description: 将sessionId从项目下移除
|
|
|
+ * @param: projectId
|
|
|
+ * @param: session
|
|
|
+ * @return: void
|
|
|
+ * @exception:
|
|
|
+ * @author: lixing
|
|
|
+ * @company: Persagy Technology Co.,Ltd
|
|
|
+ * @since: 2020/12/2 6:25 下午
|
|
|
+ * @version: V1.0
|
|
|
+ */
|
|
|
+ private static void removeProjectSessionId(String projectId, String sessionId) {
|
|
|
+ Set<String> sessionIds = projectSessionIds.getOrDefault(projectId, new CopyOnWriteArraySet());
|
|
|
+ sessionIds.remove(sessionId);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 删除客户端
|
|
|
+ *
|
|
|
+ * @param sessionId 客户端标识
|
|
|
+ */
|
|
|
+ public static void removeClient(String projectIdStr, String sessionId) {
|
|
|
+ if (StringUtils.isEmpty(projectIdStr)) {
|
|
|
+ removeProjectSessionId(allProjects, sessionId);
|
|
|
+ } else {
|
|
|
+ String[] projectIds = projectIdStr.split(",");
|
|
|
+ for (String projectId : projectIds) {
|
|
|
+ removeProjectSessionId(projectId, sessionId);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ clients.remove(sessionId);
|
|
|
+ }
|
|
|
+
|
|
|
+}
|