Browse Source

优化广播的二元key

kwl 3 weeks ago
parent
commit
ea1e365602

+ 5 - 5
src/main/java/com/jttserver/service/publisher/WebsockServer.java

@@ -159,7 +159,7 @@ public class WebsockServer extends PublishServer {
         if (streamId == null || streamId.isEmpty() || data == null || data.length == 0) {
             return;
         }
-        ChannelGroup g = streamGroups.get(new CommUtils.InfoItem(streamId, prefix));
+        ChannelGroup g = streamGroups.get(CommUtils.InfoItem.of(streamId, prefix));
         if (g != null && !g.isEmpty()) {
             g.writeAndFlush(new BinaryWebSocketFrame(Unpooled.wrappedBuffer(data)));
         }
@@ -173,8 +173,8 @@ public class WebsockServer extends PublishServer {
         if (streamId == null || streamId.isEmpty() || channelId == null || channelId.isEmpty()) {
             return;
         }
-        streamIdToChannelId.put(new CommUtils.InfoItem(streamId, prefix), channelId);
-        channelIdToStreamId.put(channelId, new CommUtils.InfoItem(streamId, prefix));
+        streamIdToChannelId.put(CommUtils.InfoItem.of(streamId, prefix), channelId);
+        channelIdToStreamId.put(channelId, CommUtils.InfoItem.of(streamId, prefix));
     }
 
     /**
@@ -202,7 +202,7 @@ public class WebsockServer extends PublishServer {
      * 获取streamId对应的channelId方法
      */
     public String getChannelIdByStreamId(String streamId, String prefix) {
-        return streamIdToChannelId.get(new CommUtils.InfoItem(streamId, prefix));
+        return streamIdToChannelId.get(CommUtils.InfoItem.of(streamId, prefix));
     }
 
     /**
@@ -279,7 +279,7 @@ public class WebsockServer extends PublishServer {
         if (streamId == null || streamId.isEmpty() || ch == null) {
             return;
         }
-        CommUtils.InfoItem infoItem = new CommUtils.InfoItem(streamId, relay.getPrefix());
+        CommUtils.InfoItem infoItem = CommUtils.InfoItem.of(streamId, relay.getPrefix());
         // 将channel加入对应的ChannelGroup
         ChannelGroup group = streamGroups.computeIfAbsent(infoItem,
                 k -> new DefaultChannelGroup(workerGroup.next()));

+ 19 - 6
src/main/java/com/jttserver/utils/CommUtils.java

@@ -3,7 +3,12 @@ package com.jttserver.utils;
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.nio.ByteBuffer;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
 import java.util.Objects;
+import java.util.concurrent.ConcurrentHashMap;
+
 
 /**
  * 通用工具方法(字节与编解码相关的公共逻辑)。
@@ -27,6 +32,7 @@ public final class CommUtils {
         public String getTitle() {
             return title;
         }
+
         public String getContent() {
             return content;
         }
@@ -50,6 +56,13 @@ public final class CommUtils {
         public String toString() {
             return "InfoItem [title=" + title + ", content=" + content + "]";
         }
+
+        // 缓存 InfoItem 列表对应的唯一实例,避免重复创建
+        private static final Map<List<String>, InfoItem> ITEMS_KEY_CACHE = new ConcurrentHashMap<>();
+
+        public static InfoItem of(String title, String content) {
+            return ITEMS_KEY_CACHE.computeIfAbsent(Arrays.asList(title, content), k -> new InfoItem(title, content));
+        }
     }
 
     // 写无符号24位整数(大端)
@@ -162,10 +175,10 @@ public final class CommUtils {
     }
 
     public static String bytesToHex(byte[] bytes) {
-         StringBuilder sb = new StringBuilder();
-         for (byte b : bytes) {
-             sb.append(String.format("%02X ", b));
-         }
-         return sb.toString().trim();
-     }
+        StringBuilder sb = new StringBuilder();
+        for (byte b : bytes) {
+            sb.append(String.format("%02X ", b));
+        }
+        return sb.toString().trim();
+    }
 }