From 6476e0b4bb7d768af0d3f920a91a261ca341f534 Mon Sep 17 00:00:00 2001 From: godotg Date: Wed, 26 Oct 2022 16:38:25 +0800 Subject: [PATCH] =?UTF-8?q?feat[protocol]:=20=E5=AD=90=E5=8D=8F=E8=AE=AE?= =?UTF-8?q?=E4=BC=9A=E8=87=AA=E5=8A=A8=E6=B3=A8=E5=86=8C=E5=8D=8F=E8=AE=AE?= =?UTF-8?q?=E5=8F=B7protocolId=EF=BC=8C=E5=A6=82=E6=9E=9C=E5=AD=90?= =?UTF-8?q?=E5=8D=8F=E8=AE=AE=E6=B2=A1=E6=9C=89=E6=8C=87=E5=AE=9AprotocolI?= =?UTF-8?q?d=E5=88=99=E8=87=AA=E5=8A=A8=E7=94=9F=E6=88=90protocolId?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/zfoo/protocol/ProtocolManager.java | 7 +++ .../registration/ProtocolAnalysis.java | 45 +++++++++++++++++++ .../java/com/zfoo/protocol/SpeedTest.java | 2 +- .../com/zfoo/protocol/packet/ObjectA.java | 7 --- .../com/zfoo/protocol/packet/ObjectB.java | 7 --- 5 files changed, 53 insertions(+), 15 deletions(-) diff --git a/protocol/src/main/java/com/zfoo/protocol/ProtocolManager.java b/protocol/src/main/java/com/zfoo/protocol/ProtocolManager.java index 934504e2..a6d0a749 100644 --- a/protocol/src/main/java/com/zfoo/protocol/ProtocolManager.java +++ b/protocol/src/main/java/com/zfoo/protocol/ProtocolManager.java @@ -123,4 +123,11 @@ public class ProtocolManager { ProtocolAnalysis.analyze(xmlProtocols, generateOperation); } + /** + * 子协议会自动注册协议号protocolId,如果子协议没有指定protocolId则自动生成protocolId + */ + public static void initProtocolAuto(Set> protocolClassSet, GenerateOperation generateOperation) { + ProtocolAnalysis.analyzeAuto(protocolClassSet, generateOperation); + } + } diff --git a/protocol/src/main/java/com/zfoo/protocol/registration/ProtocolAnalysis.java b/protocol/src/main/java/com/zfoo/protocol/registration/ProtocolAnalysis.java index 2c8ece0e..4969f348 100644 --- a/protocol/src/main/java/com/zfoo/protocol/registration/ProtocolAnalysis.java +++ b/protocol/src/main/java/com/zfoo/protocol/registration/ProtocolAnalysis.java @@ -35,6 +35,7 @@ import com.zfoo.protocol.serializer.protobuf.GenerateProtobufUtils; import com.zfoo.protocol.serializer.reflect.*; import com.zfoo.protocol.serializer.typescript.GenerateTsUtils; import com.zfoo.protocol.util.AssertionUtils; +import com.zfoo.protocol.util.ClassUtils; import com.zfoo.protocol.util.ReflectionUtils; import com.zfoo.protocol.util.StringUtils; import com.zfoo.protocol.xml.XmlProtocols; @@ -118,6 +119,50 @@ public class ProtocolAnalysis { } } + public static synchronized void analyzeAuto(Set> protocolClassSet, GenerateOperation generateOperation) { + AssertionUtils.notNull(subProtocolIdMap, "[{}]已经初始完成,请不要重复初始化", ProtocolManager.class.getSimpleName()); + try { + // 获取所有协议类 + var relevantClassSet = new HashSet<>(protocolClassSet); + for (var clazz : protocolClassSet) { + relevantClassSet.addAll(ClassUtils.relevantClass(clazz)); + } + + var relevantClassList = relevantClassSet.stream() + .sorted((a, b) -> a.getCanonicalName().compareTo(b.getCanonicalName())) + .collect(Collectors.toList()); + + // 检查协议类是否合法 + var noProtocolIds = new ArrayList>(); + for (var protocolClass : relevantClassList) { + var protocolId = getProtocolIdAndCheckClass(protocolClass); + if (protocolId >= 0) { + initProtocolClass(protocolId, protocolClass); + } else { + noProtocolIds.add(protocolClass); + } + } + var countProtocolId = (short) 0; + for (var protocolClass : noProtocolIds) { + while (protocolClassMap.containsKey(countProtocolId)) { + countProtocolId++; + } + initProtocolClass(countProtocolId, protocolClass); + } + + // 协议id和协议信息对应起来 + for (var protocolClass : relevantClassSet) { + var registration = parseProtocolRegistration(protocolClass, ProtocolModule.DEFAULT_PROTOCOL_MODULE); + protocols[registration.protocolId()] = registration; + } + + // 通过指定类注册的协议,全部使用字节码增强 + var enhanceList = Arrays.stream(protocols).filter(Objects::nonNull).collect(Collectors.toList()); + enhance(generateOperation, enhanceList); + } catch (Exception e) { + throw new RuntimeException(e); + } + } public static synchronized void analyze(XmlProtocols xmlProtocols, GenerateOperation generateOperation) { AssertionUtils.notNull(subProtocolIdMap, "[{}]已经初始完成,请不要重复初始化", ProtocolManager.class.getSimpleName()); diff --git a/protocol/src/test/java/com/zfoo/protocol/SpeedTest.java b/protocol/src/test/java/com/zfoo/protocol/SpeedTest.java index 974b41de..c7f05a8e 100644 --- a/protocol/src/test/java/com/zfoo/protocol/SpeedTest.java +++ b/protocol/src/test/java/com/zfoo/protocol/SpeedTest.java @@ -320,7 +320,7 @@ public class SpeedTest { // op.getGenerateLanguages().add(CodeLanguage.Protobuf); // zfoo协议注册(其实就是:将Set里面的协议号和对应的类注册好,这样子就可以根据协议号知道是反序列化为哪个类) - ProtocolManager.initProtocol(Set.of(ComplexObject.class, NormalObject.class, SimpleObject.class, ObjectA.class, ObjectB.class), op); + ProtocolManager.initProtocolAuto(Set.of(ComplexObject.class, NormalObject.class, SimpleObject.class), op); for (int i = 0; i < executors.length; i++) { executors[i] = Executors.newSingleThreadExecutor(); diff --git a/protocol/src/test/java/com/zfoo/protocol/packet/ObjectA.java b/protocol/src/test/java/com/zfoo/protocol/packet/ObjectA.java index 835f7acd..5e1323a4 100644 --- a/protocol/src/test/java/com/zfoo/protocol/packet/ObjectA.java +++ b/protocol/src/test/java/com/zfoo/protocol/packet/ObjectA.java @@ -24,19 +24,12 @@ import java.util.Objects; */ public class ObjectA implements IPacket { - public static final transient short PROTOCOL_ID = 102; - private int a; private Map m; private ObjectB objectB; - @Override - public short protocolId() { - return PROTOCOL_ID; - } - public int getA() { return a; } diff --git a/protocol/src/test/java/com/zfoo/protocol/packet/ObjectB.java b/protocol/src/test/java/com/zfoo/protocol/packet/ObjectB.java index 5950f603..c625aebf 100644 --- a/protocol/src/test/java/com/zfoo/protocol/packet/ObjectB.java +++ b/protocol/src/test/java/com/zfoo/protocol/packet/ObjectB.java @@ -23,15 +23,8 @@ import java.util.Objects; */ public class ObjectB implements IPacket { - public static final transient short PROTOCOL_ID = 103; - private boolean flag; - @Override - public short protocolId() { - return PROTOCOL_ID; - } - public boolean isFlag() { return flag; }