From adba1467801039181710a29921daf56564defb2e Mon Sep 17 00:00:00 2001 From: meiwei <309921330@qq.com> Date: Thu, 24 Aug 2023 12:39:32 +0800 Subject: [PATCH] =?UTF-8?q?perf[protocol]:=E5=A2=9E=E5=8A=A0=E6=94=AF?= =?UTF-8?q?=E6=8C=81protocul=E6=96=87=E4=BB=B6=E6=94=AF=E6=8C=81=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E5=8C=85=E5=90=8D=E5=92=8C=E6=9C=89=E4=BC=98=E5=8C=96?= =?UTF-8?q?probuf=E6=96=87=E4=BB=B6=E8=AF=BB=E5=8F=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- boot/pom.xml | 1 + event/pom.xml | 1 + hotswap/pom.xml | 1 + monitor/pom.xml | 1 + net/pom.xml | 1 + .../com/zfoo/net/config/model/NetConfig.java | 75 +--------- .../com/zfoo/net/packet/PacketService.java | 66 +++++---- .../com/zfoo/net/packet/common/Error.java | 6 +- .../zfoo/net/schema/NetDefinitionParser.java | 12 +- net/src/main/resources/net-1.0.xsd | 9 +- orm/pom.xml | 1 + .../java/com/zfoo/orm/entity/MailEntity.java | 2 + orm/src/test/resources/deploy-dev.properties | 2 +- protocol/pom.xml | 7 + .../generate/GenerateProtocolFile.java | 4 +- .../registration/ProtocolAnalysis.java | 62 ++++++++- .../registration/anno/NotEnhance.java | 27 ++++ .../protocol/registration/anno/Protocol.java | 2 +- .../protocol/serializer/CodeLanguage.java | 25 ++-- .../protobuf/GenerateProtobufUtils.java | 131 ++++++++---------- .../com/zfoo/protocol/util/StringUtils.java | 19 +++ .../protocol/xml/XmlProtocolDefinition.java | 10 +- .../com/zfoo/protocol/xml/XmlProtocols.java | 9 +- .../protocol/jprotobuf/JProtobufTest.java | 2 +- scheduler/pom.xml | 1 + .../zfoo/scheduler/manager/SchedulerBus.java | 13 +- storage/pom.xml | 1 + util/pom.xml | 1 + 28 files changed, 273 insertions(+), 219 deletions(-) create mode 100644 protocol/src/main/java/com/zfoo/protocol/registration/anno/NotEnhance.java diff --git a/boot/pom.xml b/boot/pom.xml index 25111875..d5e9d62b 100644 --- a/boot/pom.xml +++ b/boot/pom.xml @@ -36,6 +36,7 @@ 4.1.84.Final 2.4.17 5.3.0 + 0.10.2 5.3.0 diff --git a/event/pom.xml b/event/pom.xml index 6992ea0d..a4690658 100644 --- a/event/pom.xml +++ b/event/pom.xml @@ -36,6 +36,7 @@ 4.1.84.Final 2.4.17 5.3.0 + 0.10.2 5.3.0 diff --git a/hotswap/pom.xml b/hotswap/pom.xml index 50d5ac2d..ab6caf07 100644 --- a/hotswap/pom.xml +++ b/hotswap/pom.xml @@ -36,6 +36,7 @@ 4.1.84.Final 2.4.17 5.3.0 + 0.10.2 5.3.0 diff --git a/monitor/pom.xml b/monitor/pom.xml index fd6d2339..72d951e4 100644 --- a/monitor/pom.xml +++ b/monitor/pom.xml @@ -36,6 +36,7 @@ 4.1.84.Final 2.4.17 5.3.0 + 0.10.2 5.3.0 diff --git a/net/pom.xml b/net/pom.xml index e9a90177..fce4ab5e 100644 --- a/net/pom.xml +++ b/net/pom.xml @@ -36,6 +36,7 @@ 4.1.84.Final 2.4.17 5.3.0 + 0.10.2 5.3.0 diff --git a/net/src/main/java/com/zfoo/net/config/model/NetConfig.java b/net/src/main/java/com/zfoo/net/config/model/NetConfig.java index 82b462d3..adef8f6b 100644 --- a/net/src/main/java/com/zfoo/net/config/model/NetConfig.java +++ b/net/src/main/java/com/zfoo/net/config/model/NetConfig.java @@ -34,16 +34,9 @@ public class NetConfig { private String protocolParam; /** - * 是否生成对应语言的协议 + * 生成协议列表 */ - private boolean javascriptProtocol; - private boolean typescriptProtocol; - private boolean csharpProtocol; - private boolean luaProtocol; - private boolean gdscriptProtocol; - private boolean cppProtocol; - private boolean goProtocol; - private boolean protobufProtocol; + private String protocolList; /** * 注册中心 @@ -110,30 +103,6 @@ public class NetConfig { this.protocolParam = protocolParam; } - public boolean isJavascriptProtocol() { - return javascriptProtocol; - } - - public void setJavascriptProtocol(boolean javascriptProtocol) { - this.javascriptProtocol = javascriptProtocol; - } - - public boolean isCsharpProtocol() { - return csharpProtocol; - } - - public void setCsharpProtocol(boolean csharpProtocol) { - this.csharpProtocol = csharpProtocol; - } - - public boolean isLuaProtocol() { - return luaProtocol; - } - - public void setLuaProtocol(boolean luaProtocol) { - this.luaProtocol = luaProtocol; - } - public RegistryConfig getRegistry() { return registry; } @@ -166,44 +135,12 @@ public class NetConfig { this.consumer = consumer; } - public boolean isGdscriptProtocol() { - return gdscriptProtocol; + public String getProtocolList() { + return protocolList; } - public void setGdscriptProtocol(boolean gdscriptProtocol) { - this.gdscriptProtocol = gdscriptProtocol; - } - - public boolean isProtobufProtocol() { - return protobufProtocol; - } - - public void setProtobufProtocol(boolean protobufProtocol) { - this.protobufProtocol = protobufProtocol; - } - - public boolean isCppProtocol() { - return cppProtocol; - } - - public void setCppProtocol(boolean cppProtocol) { - this.cppProtocol = cppProtocol; - } - - public boolean isTypescriptProtocol() { - return typescriptProtocol; - } - - public void setTypescriptProtocol(boolean typescriptProtocol) { - this.typescriptProtocol = typescriptProtocol; - } - - public boolean isGoProtocol() { - return goProtocol; - } - - public void setGoProtocol(boolean goProtocol) { - this.goProtocol = goProtocol; + public void setProtocolList(String protocolList) { + this.protocolList = protocolList; } @Override diff --git a/net/src/main/java/com/zfoo/net/packet/PacketService.java b/net/src/main/java/com/zfoo/net/packet/PacketService.java index e873174c..78311027 100644 --- a/net/src/main/java/com/zfoo/net/packet/PacketService.java +++ b/net/src/main/java/com/zfoo/net/packet/PacketService.java @@ -18,20 +18,25 @@ import com.zfoo.net.router.route.PacketBus; import com.zfoo.protocol.IPacket; import com.zfoo.protocol.ProtocolManager; import com.zfoo.protocol.buffer.ByteBufUtils; +import com.zfoo.protocol.collection.CollectionUtils; import com.zfoo.protocol.exception.ExceptionUtils; import com.zfoo.protocol.generate.GenerateOperation; import com.zfoo.protocol.generate.GenerateProtocolFile; import com.zfoo.protocol.registration.IProtocolRegistration; import com.zfoo.protocol.serializer.CodeLanguage; import com.zfoo.protocol.util.DomUtils; +import com.zfoo.protocol.util.StringUtils; import com.zfoo.protocol.xml.XmlProtocols; import io.netty.buffer.ByteBuf; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; import org.springframework.util.ResourceUtils; import java.io.IOException; +import java.util.HashSet; +import java.util.Set; import java.util.function.Predicate; /** @@ -53,6 +58,7 @@ public class PacketService implements IPacketService { * 2. 服务器内部请求约定以Ask结尾,服务器内部的响应约定以Answer结尾 * 3. 服务器主动通知客户端以Notice结尾 * 4. 公共的协议放在common模块 + * 5. 内部协议范围不允许使用 */ public static final String NET_REQUEST_SUFFIX = "Request"; public static final String NET_RESPONSE_SUFFIX = "Response"; @@ -64,12 +70,15 @@ public class PacketService implements IPacketService { public static final String NET_COMMON_MODULE = "common"; + /** 内网协议最大id */ + public static final short MAN_NATIVE_PROTOCOL_ID = 100; private final Predicate netGenerateProtocolFilter = registration -> ProtocolManager.moduleByModuleId(registration.module()).getName().matches(NET_COMMON_MODULE) || registration.protocolConstructor().getDeclaringClass().getSimpleName().endsWith(NET_REQUEST_SUFFIX) || registration.protocolConstructor().getDeclaringClass().getSimpleName().endsWith(NET_RESPONSE_SUFFIX) - || registration.protocolConstructor().getDeclaringClass().getSimpleName().endsWith(NET_NOTICE_SUFFIX); + || registration.protocolConstructor().getDeclaringClass().getSimpleName().endsWith(NET_NOTICE_SUFFIX) + || registration.protocolId() > MAN_NATIVE_PROTOCOL_ID; public PacketService() { @@ -86,31 +95,16 @@ public class PacketService implements IPacketService { generateOperation.setFoldProtocol(netConfig.isFoldProtocol()); generateOperation.setProtocolPath(netConfig.getProtocolPath()); generateOperation.setProtocolParam(netConfig.getProtocolParam()); - if (netConfig.isJavascriptProtocol()) { - generateOperation.getGenerateLanguages().add(CodeLanguage.JavaScript); - } - if (netConfig.isTypescriptProtocol()) { - generateOperation.getGenerateLanguages().add(CodeLanguage.TypeScript); - } - if (netConfig.isCsharpProtocol()) { - generateOperation.getGenerateLanguages().add(CodeLanguage.CSharp); - } - if (netConfig.isLuaProtocol()) { - generateOperation.getGenerateLanguages().add(CodeLanguage.Lua); - } - if (netConfig.isGdscriptProtocol()) { - generateOperation.getGenerateLanguages().add(CodeLanguage.GdScript); - } - if (netConfig.isCppProtocol()) { - generateOperation.getGenerateLanguages().add(CodeLanguage.Cpp); - } - if (netConfig.isGoProtocol()) { - generateOperation.getGenerateLanguages().add(CodeLanguage.Go); - } - if (netConfig.isProtobufProtocol()) { - generateOperation.getGenerateLanguages().add(CodeLanguage.Protobuf); - } + var protocolArr = StringUtils.tokenize(netConfig.getProtocolList(), StringUtils.SEMICOLON_COMMA); + for (var protocolCode : protocolArr) { + protocolCode = protocolCode.replaceAll(StringUtils.SPACE_REGEX, ""); + var codeLanguage = getProtocolList(protocolCode); + if (CollectionUtils.isEmpty(codeLanguage)) { + continue; + } + generateOperation.getGenerateLanguages().addAll(codeLanguage); + } // 设置生成协议的过滤器 GenerateProtocolFile.generateProtocolFilter = netGenerateProtocolFilter; @@ -131,6 +125,28 @@ public class PacketService implements IPacketService { } } + /** + * 获取要生成协议列表 + * @param protocolCode + * @return + */ + private Set getProtocolList(String protocolCode) { + var languageSet = new HashSet(); + boolean isNumeric = StringUtils.isNumeric(protocolCode); + for (var codeLanguage : CodeLanguage.values()) { + if (isNumeric) { + var protocolBit = Integer.valueOf(protocolCode); + if ((protocolBit & codeLanguage.id) != 0) { + languageSet.add(codeLanguage); + } + } else if (codeLanguage.name().equalsIgnoreCase(protocolCode)) { + languageSet.add(codeLanguage); + break; + } + } + return languageSet; + } + @Override public DecodedPacketInfo read(ByteBuf buffer) { // 包的长度在上一层已经解析过 diff --git a/net/src/main/java/com/zfoo/net/packet/common/Error.java b/net/src/main/java/com/zfoo/net/packet/common/Error.java index adc74df9..06a1761d 100644 --- a/net/src/main/java/com/zfoo/net/packet/common/Error.java +++ b/net/src/main/java/com/zfoo/net/packet/common/Error.java @@ -14,6 +14,7 @@ package com.zfoo.net.packet.common; import com.baidu.bjf.remoting.protobuf.annotation.Ignore; +import com.baidu.bjf.remoting.protobuf.annotation.Protobuf; import com.baidu.bjf.remoting.protobuf.annotation.ProtobufClass; import com.zfoo.protocol.IPacket; import com.zfoo.protocol.ProtocolManager; @@ -29,10 +30,11 @@ public class Error implements IPacket { @Ignore public static final short PROTOCOL_ID = 101; + @Protobuf(order = 1) private int module; - + @Protobuf(order = 2) private int errorCode; - + @Protobuf(order = 3) private String errorMessage; @Override diff --git a/net/src/main/java/com/zfoo/net/schema/NetDefinitionParser.java b/net/src/main/java/com/zfoo/net/schema/NetDefinitionParser.java index f3ed6f87..b82cbe87 100644 --- a/net/src/main/java/com/zfoo/net/schema/NetDefinitionParser.java +++ b/net/src/main/java/com/zfoo/net/schema/NetDefinitionParser.java @@ -102,18 +102,10 @@ public class NetDefinitionParser implements BeanDefinitionParser { // 协议protocol.xml文件的位置。 注意:直接写protocol.xml 则是从resources目录下读 resolvePlaceholder("protocol-location", "protocolLocation", builder, element, parserContext); - // 各种语言的文件是否生成 - resolvePlaceholder("javascript-protocol", "javascriptProtocol", builder, element, parserContext); - resolvePlaceholder("typescript-protocol", "typescriptProtocol", builder, element, parserContext); - resolvePlaceholder("csharp-protocol", "csharpProtocol", builder, element, parserContext); - resolvePlaceholder("lua-protocol", "luaProtocol", builder, element, parserContext); - resolvePlaceholder("gdscript-protocol", "gdscriptProtocol", builder, element, parserContext); - resolvePlaceholder("cpp-protocol", "cppProtocol", builder, element, parserContext); - resolvePlaceholder("go-protocol", "goProtocol", builder, element, parserContext); - resolvePlaceholder("protobuf-protocol", "protobufProtocol", builder, element, parserContext); - // 文件是否折叠 resolvePlaceholder("fold-protocol", "foldProtocol", builder, element, parserContext); + // 生成各种语言的协议列表 + resolvePlaceholder("protocol-list", "protocolList", builder, element, parserContext); resolvePlaceholder("protocol-path", "protocolPath", builder, element, parserContext); diff --git a/net/src/main/resources/net-1.0.xsd b/net/src/main/resources/net-1.0.xsd index 6f80c14e..578c0951 100644 --- a/net/src/main/resources/net-1.0.xsd +++ b/net/src/main/resources/net-1.0.xsd @@ -65,15 +65,8 @@ - - - - - - - - + diff --git a/orm/pom.xml b/orm/pom.xml index c030c29c..47f7732b 100644 --- a/orm/pom.xml +++ b/orm/pom.xml @@ -36,6 +36,7 @@ 4.1.84.Final 2.4.17 5.3.0 + 0.10.2 5.3.0 diff --git a/orm/src/test/java/com/zfoo/orm/entity/MailEntity.java b/orm/src/test/java/com/zfoo/orm/entity/MailEntity.java index daa3badb..fe0b47e3 100644 --- a/orm/src/test/java/com/zfoo/orm/entity/MailEntity.java +++ b/orm/src/test/java/com/zfoo/orm/entity/MailEntity.java @@ -36,6 +36,8 @@ public class MailEntity implements IEntity { private String content; +// @Index(ascending = true, unique = false, ttlExpireAfterSeconds = 10) +// private Date createDate; @Index(ascending = true, unique = false, ttlExpireAfterSeconds = 10) private Date createDate; diff --git a/orm/src/test/resources/deploy-dev.properties b/orm/src/test/resources/deploy-dev.properties index 1be113b8..dabcfc86 100644 --- a/orm/src/test/resources/deploy-dev.properties +++ b/orm/src/test/resources/deploy-dev.properties @@ -2,5 +2,5 @@ mongodb.database=test mongodb.user= mongodb.password= mongodb.address.name=master -mongodb.address.url=127.0.0.1:27017 +mongodb.address.url=192.168.2.36:27017 # mongodb.address.url=127.0.0.1:27017, 127.0.0.1:27018 \ No newline at end of file diff --git a/protocol/pom.xml b/protocol/pom.xml index 36816536..908cec8d 100644 --- a/protocol/pom.xml +++ b/protocol/pom.xml @@ -36,6 +36,7 @@ 4.1.84.Final 2.4.17 5.3.0 + 0.10.2 5.3.0 @@ -156,6 +157,12 @@ provided + + org.reflections + reflections + ${reflections.version} + + junit junit diff --git a/protocol/src/main/java/com/zfoo/protocol/generate/GenerateProtocolFile.java b/protocol/src/main/java/com/zfoo/protocol/generate/GenerateProtocolFile.java index 2b6a8f46..5e8937fa 100644 --- a/protocol/src/main/java/com/zfoo/protocol/generate/GenerateProtocolFile.java +++ b/protocol/src/main/java/com/zfoo/protocol/generate/GenerateProtocolFile.java @@ -175,8 +175,8 @@ public abstract class GenerateProtocolFile { // 生成Protobuf协议 if (generateLanguages.contains(CodeLanguage.Protobuf)) { GenerateProtobufUtils.init(generateOperation); - GenerateProtobufUtils.createProtocolManager(); - GenerateProtobufUtils.createProtocols(); + GenerateProtobufUtils.createProtocolManager(allSortedGenerateProtocols); + GenerateProtobufUtils.createProtocols(allSortedGenerateProtocols); } // 预留参数,以后可能会用,比如给Lua修改一个后缀名称 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 86146fc1..aa745fbd 100644 --- a/protocol/src/main/java/com/zfoo/protocol/registration/ProtocolAnalysis.java +++ b/protocol/src/main/java/com/zfoo/protocol/registration/ProtocolAnalysis.java @@ -23,6 +23,7 @@ import com.zfoo.protocol.generate.GenerateProtocolFile; import com.zfoo.protocol.generate.GenerateProtocolNote; import com.zfoo.protocol.generate.GenerateProtocolPath; import com.zfoo.protocol.registration.anno.Compatible; +import com.zfoo.protocol.registration.anno.NotEnhance; import com.zfoo.protocol.registration.anno.Protocol; import com.zfoo.protocol.registration.field.*; import com.zfoo.protocol.serializer.cpp.GenerateCppUtils; @@ -41,6 +42,7 @@ import com.zfoo.protocol.util.StringUtils; import com.zfoo.protocol.xml.XmlProtocols; import javassist.CannotCompileException; import javassist.NotFoundException; +import org.reflections.Reflections; import java.io.IOException; import java.lang.reflect.*; @@ -165,6 +167,10 @@ public class ProtocolAnalysis { } public static synchronized void analyze(XmlProtocols xmlProtocols, GenerateOperation generateOperation) { + if (xmlProtocols.isPackages()) { + analyzePackage(xmlProtocols, generateOperation); + return; + } AssertionUtils.notNull(subProtocolIdMap, "[{}]已经初始完成,请不要重复初始化", ProtocolManager.class.getSimpleName()); try { var enhanceList = new ArrayList(); @@ -207,7 +213,7 @@ public class ProtocolAnalysis { var clazz = Class.forName(location); var protocolId = ProtocolManager.protocolId(clazz); var registration = parseProtocolRegistration(clazz, module); - if (protocolDefinition.isEnhance()) { + if (!clazz.isAnnotationPresent(NotEnhance.class)) { enhanceList.add(registration); } // 注册协议 @@ -220,6 +226,60 @@ public class ProtocolAnalysis { } } + public static void analyzePackage(XmlProtocols xmlProtocols, GenerateOperation generateOperation) { + AssertionUtils.notNull(subProtocolIdMap, "[{}]已经初始完成,请不要重复初始化", ProtocolManager.class.getSimpleName()); + try { + var packageList = new HashSet(); + for (var moduleDefinition : xmlProtocols.getModules()) { + var module = new ProtocolModule(moduleDefinition.getId(), moduleDefinition.getName()); + + AssertionUtils.isTrue(module.getId() > 0, "[module:{}] [id:{}] 模块必须大于等于1", module.getName(), module.getId()); + AssertionUtils.isNull(modules[module.getId()], "duplicate [module:{}] [id:{}] Exception!", module.getName(), module.getId()); + AssertionUtils.notNull(moduleDefinition.getProtocols(), "[module:{}] does not have any protocols", module.getName()); + modules[module.getId()] = module; + + for (var protocolDefinition : moduleDefinition.getProtocols()) { + packageList.add(protocolDefinition.getLocation()); + } + } + + // 获取所有IPack子类 + var packetClazzList = scanClassList(packageList); + for (Class clazz : packetClazzList) { + var protocolId = getProtocolIdAndCheckClass(clazz); + initProtocolClass(protocolId, clazz); + } + + var enhanceList = new ArrayList(); + for (var moduleDefinition : xmlProtocols.getModules()) { + var module = modules[moduleDefinition.getId()]; + for (Class clazz : packetClazzList) { + var protocolId = ProtocolManager.protocolId(clazz); + if (protocolId < moduleDefinition.getMinId() || protocolId >= moduleDefinition.getMaxId()) { + continue; + } + var registration = parseProtocolRegistration(clazz, module); + if (!clazz.isAnnotationPresent(NotEnhance.class)) { + enhanceList.add(registration); + } + // 注册协议 + protocols[protocolId] = registration; + } + } + enhance(generateOperation, enhanceList); + } catch (Exception e) { + throw new UnknownException(e); + } + } + + public static Set> scanClassList(Set packageList) { + //获取该路径下所有类 + Reflections reflections = new Reflections(packageList); + //获取继承了IPacket的所有类 + Set> classSet = reflections.getSubTypesOf(IPacket.class); + return classSet.stream().filter(k -> !k.isInterface()).collect(Collectors.toSet()); + } + private static void enhance(GenerateOperation generateOperation, List enhanceList) throws IOException, ClassNotFoundException, NotFoundException, CannotCompileException, NoSuchFieldException, InvocationTargetException, NoSuchMethodException, IllegalAccessException, InstantiationException { enhanceProtocolBefore(generateOperation); enhanceProtocolRegistration(enhanceList); diff --git a/protocol/src/main/java/com/zfoo/protocol/registration/anno/NotEnhance.java b/protocol/src/main/java/com/zfoo/protocol/registration/anno/NotEnhance.java new file mode 100644 index 00000000..4a5df4b7 --- /dev/null +++ b/protocol/src/main/java/com/zfoo/protocol/registration/anno/NotEnhance.java @@ -0,0 +1,27 @@ +/* + * Copyright (C) 2020 The zfoo Authors + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed + * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and limitations under the License. + * + */ + +package com.zfoo.protocol.registration.anno; + +import java.lang.annotation.*; + +/** + * @author meiw + * @version 3.0 + */ +@Documented +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.TYPE}) +public @interface NotEnhance { + +} diff --git a/protocol/src/main/java/com/zfoo/protocol/registration/anno/Protocol.java b/protocol/src/main/java/com/zfoo/protocol/registration/anno/Protocol.java index 6734d440..4c6de908 100644 --- a/protocol/src/main/java/com/zfoo/protocol/registration/anno/Protocol.java +++ b/protocol/src/main/java/com/zfoo/protocol/registration/anno/Protocol.java @@ -14,5 +14,5 @@ public @interface Protocol { short id() default 0; String note() default ""; - } + diff --git a/protocol/src/main/java/com/zfoo/protocol/serializer/CodeLanguage.java b/protocol/src/main/java/com/zfoo/protocol/serializer/CodeLanguage.java index 84e129f8..cf426c1b 100644 --- a/protocol/src/main/java/com/zfoo/protocol/serializer/CodeLanguage.java +++ b/protocol/src/main/java/com/zfoo/protocol/serializer/CodeLanguage.java @@ -21,22 +21,29 @@ public enum CodeLanguage { /** * Javassist字节码增强 */ - Enhance, + Enhance(1), - Cpp, + Cpp(2), - Go, + Go(4), - JavaScript, + JavaScript(8), - TypeScript, + TypeScript(16), - Lua, + Lua(32), - CSharp, + CSharp(64), - GdScript, + GdScript(128), - Protobuf + Protobuf(256) + ; + + public final int id; + + private CodeLanguage(int id) { + this.id = id; + } } diff --git a/protocol/src/main/java/com/zfoo/protocol/serializer/protobuf/GenerateProtobufUtils.java b/protocol/src/main/java/com/zfoo/protocol/serializer/protobuf/GenerateProtobufUtils.java index 2caff372..22df7a2e 100644 --- a/protocol/src/main/java/com/zfoo/protocol/serializer/protobuf/GenerateProtobufUtils.java +++ b/protocol/src/main/java/com/zfoo/protocol/serializer/protobuf/GenerateProtobufUtils.java @@ -14,8 +14,10 @@ package com.zfoo.protocol.serializer.protobuf; import com.baidu.bjf.remoting.protobuf.annotation.Protobuf; +import com.baidu.bjf.remoting.protobuf.annotation.ProtobufClass; import com.zfoo.protocol.ProtocolManager; import com.zfoo.protocol.collection.ArrayUtils; +import com.zfoo.protocol.collection.CollectionUtils; import com.zfoo.protocol.exception.RunException; import com.zfoo.protocol.generate.GenerateOperation; import com.zfoo.protocol.generate.GenerateProtocolNote; @@ -32,10 +34,7 @@ import com.zfoo.protocol.util.StringUtils; import java.io.File; import java.io.IOException; -import java.util.Arrays; -import java.util.HashSet; -import java.util.Map; -import java.util.TreeMap; +import java.util.*; import java.util.stream.Collectors; import static com.zfoo.protocol.util.FileUtils.LS; @@ -49,11 +48,12 @@ public abstract class GenerateProtobufUtils { private static String protocolOutputRootPath = "protos/"; private static String protocolManagerName = "protocols"; + public static final String NET_COMMON_MODULE = "common"; - private static XmlProtobuf xmlProtobuf = null; + private static String protocolParam = null; public static String syntax() { - return StringUtils.format("syntax = {}{}{};", StringUtils.QUOTATION_MARK, xmlProtobuf.getSyntax(), StringUtils.QUOTATION_MARK); + return StringUtils.format("syntax = {}{}{};", StringUtils.QUOTATION_MARK, "proto3", StringUtils.QUOTATION_MARK); } public static String option(String optionKey, String optionValue) { @@ -65,6 +65,9 @@ public abstract class GenerateProtobufUtils { } public static Map parseParam(String param) { + if (StringUtils.isEmpty(param)) { + return Map.of(); + } var params = param.trim().split(StringUtils.SEMICOLON_REGEX); if (ArrayUtils.isEmpty(params)) { @@ -83,63 +86,22 @@ public abstract class GenerateProtobufUtils { protocolOutputRootPath = FileUtils.joinPath(generateOperation.getProtocolPath(), protocolOutputRootPath); var protocolParam = generateOperation.getProtocolParam(); - if (StringUtils.isEmpty(protocolParam)) { - throw new RunException("生成protobuf协议的protocolParam参数不能为空"); - } - var map = parseParam(protocolParam); - - var protobufXmlPath = map.get("protobuf"); + GenerateProtobufUtils.protocolParam = protocolParam; FileUtils.deleteFile(new File(protocolOutputRootPath)); FileUtils.createDirectory(protocolOutputRootPath); - var inputStream = ClassUtils.getFileFromClassPath(protobufXmlPath); - var xmlProtobufObj = DomUtils.inputStream2Object(inputStream, XmlProtobuf.class); - - if (!xmlProtobufObj.getSyntax().equals("proto3")) { - throw new RunException("生成protobuf协议只支持proto3"); - } - - var protoSet = new HashSet(); - - for (var protos : xmlProtobufObj.getProtos()) { - if (protos.getName().equals(protocolManagerName)) { - throw new RunException("protobuf的协议文件名称不能用保留名称[{}]", protocolManagerName); - } - - if (protoSet.contains(protos.getName())) { - throw new RunException("protobuf的协议文件名称重复定义[{}]", protos.getName()); - } - - protoSet.add(protos.getName()); - } - - xmlProtobuf = xmlProtobufObj; } - public static void createProtocolManager() throws ClassNotFoundException { - var allGenerateProtocols = new HashSet(); - for (var protos : xmlProtobuf.getProtos()) { - for (var protocol : protos.getProtocols()) { - var protocolClass = Class.forName(protocol.getLocation()); - var protocolId = ProtocolManager.protocolId(protocolClass); - var protocolRegistration = ProtocolManager.getProtocol(protocolId); - - if (allGenerateProtocols.contains(protocolRegistration)) { - throw new RunException("protobuf的xml协议文件中重复定义了协议[{}]", protocolClass.getSimpleName()); - } - - allGenerateProtocols.add(protocolRegistration); - } - } - + public static void createProtocolManager(List allGenerateProtocols) { var builder = new StringBuilder(); builder.append(syntax()); builder.append(LS).append(LS); - if (StringUtils.isNotEmpty(xmlProtobuf.getOption())) { - var optionMap = parseParam(xmlProtobuf.getOption()); + var protocolParam = GenerateProtobufUtils.protocolParam; + var optionMap = parseParam(protocolParam); + if (CollectionUtils.isNotEmpty(optionMap)) { for (var option : optionMap.entrySet()) { builder.append(option(option.getKey(), option.getValue())).append(LS); } @@ -162,36 +124,37 @@ public abstract class GenerateProtobufUtils { FileUtils.writeStringToFile(new File(protocolOutputPath), builder.toString(), true); } - public static void createProtocols() throws ClassNotFoundException { - for (var protos : xmlProtobuf.getProtos()) { - + public static void createProtocols(List allGenerateProtocols) { + var packageMap = new HashMap>(); + for (var protocolRegistration : allGenerateProtocols) { + var clazz = protocolRegistration.protocolConstructor().getDeclaringClass(); + String packageName = clazz.getPackageName(); + var packagList = packageMap.computeIfAbsent(packageName, k -> new ArrayList<>()); + packagList.add(protocolRegistration); + } + for (var protos : packageMap.entrySet()) { var builder = new StringBuilder(); builder.append(syntax()); builder.append(LS).append(LS); - if (StringUtils.isNotEmpty(protos.getImportProto())) { - var params = protos.getImportProto().trim().split(StringUtils.SEMICOLON_REGEX); - for (var importProto : params) { - if (StringUtils.isBlank(importProto)) { - continue; - } - builder.append(importProto(importProto.trim())).append(LS); - } - builder.append(LS); - } - - if (StringUtils.isNotEmpty(protos.getOption())) { - var optionMap = parseParam(protos.getOption()); + var protocolParam = GenerateProtobufUtils.protocolParam; + var optionMap = parseParam(protocolParam); + if (CollectionUtils.isNotEmpty(optionMap)) { for (var option : optionMap.entrySet()) { builder.append(option(option.getKey(), option.getValue())).append(LS); } builder.append(LS); } + builder.append(importProto(NET_COMMON_MODULE)).append(LS); + builder.append(LS); - for (var protocol : protos.getProtocols()) { - var protocolClass = Class.forName(protocol.getLocation()); - var protocolId = ProtocolManager.protocolId(protocolClass); - var protocolRegistration = ProtocolManager.getProtocol(protocolId); + for (var protocolRegistration : protos.getValue()) { + var protocolClass = protocolRegistration.protocolConstructor().getDeclaringClass(); + var protocolId = protocolRegistration.protocolId(); + + if (!isProtobufProtocol((ProtocolRegistration) protocolRegistration)) { + continue; + } builder.append("// id = ").append(protocolId).append(LS); @@ -205,11 +168,31 @@ public abstract class GenerateProtobufUtils { builder.append("}").append(LS).append(LS); } - var protocolOutputPath = StringUtils.format("{}/{}.proto", protocolOutputRootPath, protos.getName()); + String protoName = StringUtils.substringAfterLast(protos.getKey(), StringUtils.PERIOD); + var protocolOutputPath = StringUtils.format("{}/{}.proto", protocolOutputRootPath, protoName); FileUtils.writeStringToFile(new File(protocolOutputPath), builder.toString(), true); } } + /** + * 判断是否是protobuf协议 + * @param registration + * @return + */ + private static boolean isProtobufProtocol(ProtocolRegistration registration) { + var protocolClass = registration.protocolConstructor().getDeclaringClass(); + if (protocolClass.isAnnotationPresent(ProtobufClass.class)) { + return true; + } + var fields = registration.getFields(); + for (var field : fields) { + if (!field.isAnnotationPresent(Protobuf.class)) { + return false; + } + } + return true; + } + /** * 优化一下生成协议顺序 * @@ -317,7 +300,7 @@ public abstract class GenerateProtobufUtils { public static void clear() { protocolOutputRootPath = null; protocolManagerName = null; - xmlProtobuf = null; + protocolParam = null; } } diff --git a/protocol/src/main/java/com/zfoo/protocol/util/StringUtils.java b/protocol/src/main/java/com/zfoo/protocol/util/StringUtils.java index 7697d572..4e20e488 100644 --- a/protocol/src/main/java/com/zfoo/protocol/util/StringUtils.java +++ b/protocol/src/main/java/com/zfoo/protocol/util/StringUtils.java @@ -79,6 +79,8 @@ public abstract class StringUtils { public static final String EMPTY_JSON = "{}"; + public static final String SEMICOLON_COMMA = ";|,"; //分号或者逗号 + public static final String MULTIPLE_HYPHENS = "-----------------------------------------------------------------------"; @@ -482,5 +484,22 @@ public abstract class StringUtils { return Character.isWhitespace(ch) || STOP_WORD.contains(ch); } + /** + * 判断是否是数字 + * @param str + * @return + */ + public static boolean isNumeric(String str) { + if(str == null) { + return false; + } + int sz = str.length(); + for(int i = 0; i < sz; i++) { + if (!Character.isDigit(str.charAt(i))) { + return false; + } + } + return true; + } } diff --git a/protocol/src/main/java/com/zfoo/protocol/xml/XmlProtocolDefinition.java b/protocol/src/main/java/com/zfoo/protocol/xml/XmlProtocolDefinition.java index d0567ab0..68502bab 100644 --- a/protocol/src/main/java/com/zfoo/protocol/xml/XmlProtocolDefinition.java +++ b/protocol/src/main/java/com/zfoo/protocol/xml/XmlProtocolDefinition.java @@ -16,7 +16,7 @@ package com.zfoo.protocol.xml; import com.fasterxml.jackson.annotation.JsonPropertyOrder; import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; -@JsonPropertyOrder({"id", "location", "enhance"}) +@JsonPropertyOrder({"id", "location"}) public class XmlProtocolDefinition { @JacksonXmlProperty(isAttribute = true, localName = "id") @@ -25,10 +25,6 @@ public class XmlProtocolDefinition { @JacksonXmlProperty(isAttribute = true, localName = "location") private String location; - @JacksonXmlProperty(isAttribute = true, localName = "enhance") - private boolean enhance = true; - - public short getId() { return id; } @@ -37,8 +33,4 @@ public class XmlProtocolDefinition { return location; } - public boolean isEnhance() { - return enhance; - } - } diff --git a/protocol/src/main/java/com/zfoo/protocol/xml/XmlProtocols.java b/protocol/src/main/java/com/zfoo/protocol/xml/XmlProtocols.java index 7b4d8979..ad892c02 100644 --- a/protocol/src/main/java/com/zfoo/protocol/xml/XmlProtocols.java +++ b/protocol/src/main/java/com/zfoo/protocol/xml/XmlProtocols.java @@ -20,13 +20,16 @@ import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement; import java.util.List; -@JsonPropertyOrder({"author", "modules"}) +@JsonPropertyOrder({"author", "packages", "modules"}) @JacksonXmlRootElement(localName = "protocols") public class XmlProtocols { @JacksonXmlProperty(isAttribute = true, localName = "author") private String author; + @JacksonXmlProperty(isAttribute = true, localName = "packages") + private boolean packages; + @JacksonXmlProperty(localName = "module") @JacksonXmlElementWrapper(useWrapping = false) private List modules; @@ -35,6 +38,10 @@ public class XmlProtocols { return author; } + public boolean isPackages() { + return packages; + } + public List getModules() { return modules; } diff --git a/protocol/src/test/java/com/zfoo/protocol/jprotobuf/JProtobufTest.java b/protocol/src/test/java/com/zfoo/protocol/jprotobuf/JProtobufTest.java index 7cdf11a7..d07d25f7 100644 --- a/protocol/src/test/java/com/zfoo/protocol/jprotobuf/JProtobufTest.java +++ b/protocol/src/test/java/com/zfoo/protocol/jprotobuf/JProtobufTest.java @@ -76,7 +76,7 @@ public class JProtobufTest { var op = GenerateOperation.NO_OPERATION; op.getGenerateLanguages().add(CodeLanguage.Protobuf); op.setFoldProtocol(true); - op.setProtocolParam("protobuf=protobuf.xml"); +// op.setProtocolParam("protobuf=protobuf.xml"); ProtocolManager.initProtocol(Set.of(ObjectA.class, ObjectB.class, ObjectC.class), op); } diff --git a/scheduler/pom.xml b/scheduler/pom.xml index a3394f10..f8bc0cbb 100644 --- a/scheduler/pom.xml +++ b/scheduler/pom.xml @@ -36,6 +36,7 @@ 4.1.84.Final 2.4.17 5.3.0 + 0.10.2 5.3.0 diff --git a/scheduler/src/main/java/com/zfoo/scheduler/manager/SchedulerBus.java b/scheduler/src/main/java/com/zfoo/scheduler/manager/SchedulerBus.java index 93aec1cc..a36966d5 100644 --- a/scheduler/src/main/java/com/zfoo/scheduler/manager/SchedulerBus.java +++ b/scheduler/src/main/java/com/zfoo/scheduler/manager/SchedulerBus.java @@ -36,6 +36,7 @@ import java.util.concurrent.atomic.AtomicInteger; */ public abstract class SchedulerBus { + private static final Logger logger = LoggerFactory.getLogger(SchedulerBus.class); private static final List schedulerDefList = new CopyOnWriteArrayList<>(); @@ -165,24 +166,24 @@ public abstract class SchedulerBus { /** * 不断执行的周期循环任务 */ - public static void scheduleAtFixedRate(Runnable runnable, long period, TimeUnit unit) { + public static ScheduledFuture scheduleAtFixedRate(Runnable runnable, long period, TimeUnit unit) { if (SchedulerContext.isStop()) { - return; + return null; } - executor.scheduleAtFixedRate(SafeRunnable.valueOf(runnable), 0, period, unit); + return executor.scheduleAtFixedRate(SafeRunnable.valueOf(runnable), 0, period, unit); } /** * 固定延迟执行的任务 */ - public static void schedule(Runnable runnable, long delay, TimeUnit unit) { + public static ScheduledFuture schedule(Runnable runnable, long delay, TimeUnit unit) { if (SchedulerContext.isStop()) { - return; + return null; } - executor.schedule(SafeRunnable.valueOf(runnable), delay, unit); + return executor.schedule(SafeRunnable.valueOf(runnable), delay, unit); } /** diff --git a/storage/pom.xml b/storage/pom.xml index 7d64a33c..20a2b765 100644 --- a/storage/pom.xml +++ b/storage/pom.xml @@ -36,6 +36,7 @@ 4.1.84.Final 2.4.17 5.3.0 + 0.10.2 5.3.0 diff --git a/util/pom.xml b/util/pom.xml index ab0815c7..58bae1e7 100644 --- a/util/pom.xml +++ b/util/pom.xml @@ -36,6 +36,7 @@ 4.1.84.Final 2.4.17 5.3.0 + 0.10.2 5.3.0