From 5285d249e702eeab3ad3847aaa24523ef0f1a544 Mon Sep 17 00:00:00 2001
From: Helius <wangdoubleone@gmail.com>
Date: Wed, 24 Feb 2021 18:11:06 +0800
Subject: [PATCH] add websocket

---
 src/main/java/com/xcong/excoin/netty/common/ChannelManager.java |   82 +++++++++++++++++++++++++++++++++++++++++
 1 files changed, 82 insertions(+), 0 deletions(-)

diff --git a/src/main/java/com/xcong/excoin/netty/common/ChannelManager.java b/src/main/java/com/xcong/excoin/netty/common/ChannelManager.java
index 5d158f6..3937137 100644
--- a/src/main/java/com/xcong/excoin/netty/common/ChannelManager.java
+++ b/src/main/java/com/xcong/excoin/netty/common/ChannelManager.java
@@ -8,6 +8,8 @@
 import io.netty.channel.group.DefaultChannelGroup;
 import io.netty.util.concurrent.GlobalEventExecutor;
 
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 
@@ -19,6 +21,12 @@
 public class ChannelManager {
 
     private static final ChannelGroup WEBSOCKET_GROUP = new DefaultChannelGroup(GlobalEventExecutor.INSTANCE);
+
+    private static final ConcurrentMap<String, ChannelGroup> DEPTH_MAP = new ConcurrentHashMap<>();
+
+    private static final ConcurrentMap<String, ChannelGroup> TRADE_MAP = new ConcurrentHashMap<>();
+
+    private static final ConcurrentMap<String, ChannelGroup> KLINE_MAP = new ConcurrentHashMap<>();
 
     // 当前连接到服务器的通道(tcp和websocket)
     private static final ConcurrentMap<String, ChannelId> CHANNEL_MAP = new ConcurrentHashMap<>();
@@ -52,5 +60,79 @@
         WEBSOCKET_GROUP.writeAndFlush(NettyTools.webSocketBytes(msg));
     }
 
+    public static void putSymbolSubChannel(@NotBlank String symbol, @NotNull Channel channel, @NotBlank String type) {
+        switch (type) {
+            case "kline" :
+                ChannelGroup kline = KLINE_MAP.get(symbol);
+                if (kline == null) {
+                    kline = new DefaultChannelGroup(GlobalEventExecutor.INSTANCE);
+                }
+                kline.add(channel);
+                KLINE_MAP.put(symbol, kline);
+                break;
+            case "depth" :
+                ChannelGroup depth = DEPTH_MAP.get(symbol);
+                if (depth == null) {
+                    depth = new DefaultChannelGroup(GlobalEventExecutor.INSTANCE);
+                }
+                depth.add(channel);
+                DEPTH_MAP.put(symbol, depth);
+                break;
+            case "trade" :
+                ChannelGroup trade = TRADE_MAP.get(symbol);
+                if (trade == null) {
+                    trade = new DefaultChannelGroup(GlobalEventExecutor.INSTANCE);
+                }
+                trade.add(channel);
+                TRADE_MAP.put(symbol, trade);
+                break;
+            default:
+                break;
+        }
+    }
+
+    public static void removeSymbolUnSubChannel(@NotBlank String symbol, @NotNull Channel channel, @NotBlank String type) {
+        switch (type) {
+            case "kline" :
+                ChannelGroup kline = KLINE_MAP.get(symbol);
+                if (kline == null) {
+                    return;
+                }
+                kline.remove(channel);
+                KLINE_MAP.put(symbol, kline);
+                break;
+            case "depth" :
+                ChannelGroup depth = DEPTH_MAP.get(symbol);
+                if (depth == null) {
+                    return;
+                }
+                depth.remove(channel);
+                DEPTH_MAP.put(symbol, depth);
+                break;
+            case "trade" :
+                ChannelGroup trade = TRADE_MAP.get(symbol);
+                if (trade == null) {
+                    return;
+                }
+                trade.remove(channel);
+                TRADE_MAP.put(symbol, trade);
+                break;
+            default:
+                break;
+        }
+    }
+
+    public static ChannelGroup getChannelGroup(@NotBlank String symbol, @NotBlank String type) {
+        switch (type) {
+            case "kline" :
+                return KLINE_MAP.get(symbol);
+            case "depth" :
+                return DEPTH_MAP.get(symbol);
+            case "trade" :
+                return TRADE_MAP.get(symbol);
+            default:
+                return new DefaultChannelGroup(GlobalEventExecutor.INSTANCE);
+        }
+    }
 
 }

--
Gitblit v1.9.1