diff --git a/net/src/main/java/com/zfoo/net/dispatcher/manager/PacketBus.java b/net/src/main/java/com/zfoo/net/dispatcher/manager/PacketBus.java index dfb59197..d54dc0ae 100644 --- a/net/src/main/java/com/zfoo/net/dispatcher/manager/PacketBus.java +++ b/net/src/main/java/com/zfoo/net/dispatcher/manager/PacketBus.java @@ -26,6 +26,7 @@ import com.zfoo.net.session.model.Session; import com.zfoo.protocol.IPacket; import com.zfoo.protocol.ProtocolManager; import com.zfoo.protocol.collection.ArrayUtils; +import com.zfoo.protocol.registration.IProtocolRegistration; import com.zfoo.protocol.util.AssertionUtils; import com.zfoo.protocol.util.ReflectionUtils; import com.zfoo.protocol.util.StringUtils; @@ -43,9 +44,10 @@ public abstract class PacketBus { private static final Logger logger = LoggerFactory.getLogger(PacketBus.class); /** - * 客户端和服务端都有接受packet的方法,packetReceiverList对应的就是包的接收方法 + * 客户端和服务端都有接受packet的方法,packetReceiverList对应的就是包的接收方法,将receiver注册到IProtocolRegistration */ - private static final IPacketReceiver[] packetReceiverList = new IPacketReceiver[ProtocolManager.MAX_PROTOCOL_NUM]; + public static final IProtocolRegistration[] packetReceiverList = ProtocolManager.protocols; + /** * 正常消息的接收 @@ -54,7 +56,7 @@ public abstract class PacketBus { * 接收者同时只能处理一个session的一个包,同一个发送者发送过来的包排队处理 */ public static void submit(Session session, IPacket packet, IPacketAttachment packetAttachment) { - var packetReceiver = packetReceiverList[packet.protocolId()]; + var packetReceiver = (IPacketReceiver) packetReceiverList[packet.protocolId()].receiver(); if (packetReceiver == null) { throw new RuntimeException(StringUtils.format("no any packetReceiverDefinition found for this [packet:{}]", packet.getClass().getName())); } @@ -124,7 +126,12 @@ public abstract class PacketBus { var protocolId = (short) protocolIdField.get(null); var receiverDefinition = new PacketReceiverDefinition(bean, method, packetClazz, attachmentClazz); var enhanceReceiverDefinition = EnhanceUtils.createPacketReceiver(receiverDefinition); - packetReceiverList[protocolId] = enhanceReceiverDefinition; + + // 将receiver注册到IProtocolRegistration + var protocolRegistration = packetReceiverList[protocolId]; + var receiverField = ReflectionUtils.getFieldByNameInPOJOClass(protocolRegistration.getClass(), "receiver"); + ReflectionUtils.makeAccessible(receiverField); + ReflectionUtils.setField(receiverField, protocolRegistration, enhanceReceiverDefinition); } catch (Throwable t) { throw new RuntimeException(t); } diff --git a/net/src/main/java/com/zfoo/net/packet/service/PacketService.java b/net/src/main/java/com/zfoo/net/packet/service/PacketService.java index 267e12e3..c67bba15 100644 --- a/net/src/main/java/com/zfoo/net/packet/service/PacketService.java +++ b/net/src/main/java/com/zfoo/net/packet/service/PacketService.java @@ -14,6 +14,7 @@ package com.zfoo.net.packet.service; import com.zfoo.net.NetContext; +import com.zfoo.net.dispatcher.manager.PacketBus; import com.zfoo.net.packet.model.DecodedPacketInfo; import com.zfoo.net.packet.model.IPacketAttachment; import com.zfoo.protocol.IPacket; @@ -104,6 +105,13 @@ public class PacketService implements IPacketService { logger.error(ExceptionUtils.getMessage(e)); throw new RuntimeException(e); } + + // 注册协议接收器 + var beanNames = applicationContext.getBeanDefinitionNames(); + for (var beanName : beanNames) { + var bean = applicationContext.getBean(beanName); + PacketBus.registerPacketReceiverDefinition(bean); + } } @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 2dfe5f3c..b4928d51 100644 --- a/net/src/main/java/com/zfoo/net/schema/NetDefinitionParser.java +++ b/net/src/main/java/com/zfoo/net/schema/NetDefinitionParser.java @@ -60,11 +60,6 @@ public class NetDefinitionParser implements BeanDefinitionParser { builder.addPropertyReference("localConfig", NetConfig.class.getCanonicalName()); parserContext.getRegistry().registerBeanDefinition(clazz.getCanonicalName(), builder.getBeanDefinition()); - // 注册NetProcessor - clazz = NetProcessor.class; - builder = BeanDefinitionBuilder.rootBeanDefinition(clazz); - parserContext.getRegistry().registerBeanDefinition(clazz.getCanonicalName(), builder.getBeanDefinition()); - // 注册ProtocolManager clazz = ProtocolManager.class; builder = BeanDefinitionBuilder.rootBeanDefinition(clazz); diff --git a/net/src/main/java/com/zfoo/net/schema/NetProcessor.java b/net/src/main/java/com/zfoo/net/schema/NetProcessor.java deleted file mode 100644 index fc73bb7a..00000000 --- a/net/src/main/java/com/zfoo/net/schema/NetProcessor.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * 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.net.schema; - -import com.zfoo.net.dispatcher.manager.PacketBus; -import org.springframework.beans.BeansException; -import org.springframework.beans.factory.config.BeanPostProcessor; - -/** - * @author jaysunxiao - * @version 3.0 - */ -public class NetProcessor implements BeanPostProcessor { - - @Override - public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { - PacketBus.registerPacketReceiverDefinition(bean); - return bean; - } - -} diff --git a/protocol/src/main/java/com/zfoo/protocol/registration/EnhanceUtils.java b/protocol/src/main/java/com/zfoo/protocol/registration/EnhanceUtils.java index 4cca32fb..b50d82c4 100644 --- a/protocol/src/main/java/com/zfoo/protocol/registration/EnhanceUtils.java +++ b/protocol/src/main/java/com/zfoo/protocol/registration/EnhanceUtils.java @@ -134,6 +134,10 @@ public abstract class EnhanceUtils { constructorFiled.setModifiers(Modifier.PRIVATE); enhanceClazz.addField(constructorFiled); + CtField receiverFiled = new CtField(classPool.get(Object.class.getCanonicalName()), "receiver", enhanceClazz); + receiverFiled.setModifiers(Modifier.PRIVATE); + enhanceClazz.addField(receiverFiled); + // 定义类所包含的所有子协议成员 var allSubProtocolIds = ProtocolAnalysis.getAllSubProtocolIds(protocolId) .stream() @@ -142,7 +146,7 @@ public abstract class EnhanceUtils { for (var subProtocolId : allSubProtocolIds) { var protocolRegistrationField = new CtField(classPool.get(IProtocolRegistration.class.getCanonicalName()), getProtocolRegistrationFieldNameByProtocolId(subProtocolId), enhanceClazz); - constructorFiled.setModifiers(Modifier.PRIVATE); + protocolRegistrationField.setModifiers(Modifier.PRIVATE); enhanceClazz.addField(protocolRegistrationField); } @@ -163,6 +167,11 @@ public abstract class EnhanceUtils { protocolConstructorMethod.setBody("{return this.constructor;}"); enhanceClazz.addMethod(protocolConstructorMethod); + CtMethod receiverMethod = new CtMethod(classPool.get(Object.class.getCanonicalName()), "receiver", null, enhanceClazz); + receiverMethod.setModifiers(Modifier.PUBLIC + Modifier.FINAL); + receiverMethod.setBody("{return this.receiver;}"); + enhanceClazz.addMethod(receiverMethod); + CtMethod moduleMethod = new CtMethod(classPool.get(byte.class.getCanonicalName()), "module", null, enhanceClazz); moduleMethod.setModifiers(Modifier.PUBLIC + Modifier.FINAL); moduleMethod.setBody("{return " + registration.module() + ";}"); diff --git a/protocol/src/main/java/com/zfoo/protocol/registration/IProtocolRegistration.java b/protocol/src/main/java/com/zfoo/protocol/registration/IProtocolRegistration.java index c455ef25..7f0fae90 100644 --- a/protocol/src/main/java/com/zfoo/protocol/registration/IProtocolRegistration.java +++ b/protocol/src/main/java/com/zfoo/protocol/registration/IProtocolRegistration.java @@ -30,8 +30,19 @@ public interface IProtocolRegistration { Constructor protocolConstructor(); - Object read(ByteBuf buffer); + /** + * 协议接收器,回调方法,主要是存放一些额外的参数 + */ + Object receiver(); + /** + * 序列化 + */ void write(ByteBuf buffer, IPacket packet); + /** + * 反序列化 + */ + Object read(ByteBuf buffer); + } diff --git a/protocol/src/main/java/com/zfoo/protocol/registration/ProtocolRegistration.java b/protocol/src/main/java/com/zfoo/protocol/registration/ProtocolRegistration.java index 36bc9544..dbec0db5 100644 --- a/protocol/src/main/java/com/zfoo/protocol/registration/ProtocolRegistration.java +++ b/protocol/src/main/java/com/zfoo/protocol/registration/ProtocolRegistration.java @@ -37,6 +37,8 @@ public class ProtocolRegistration implements IProtocolRegistration { private byte module; private Constructor constructor; + private Object receiver; + private Field[] fields; @@ -64,24 +66,12 @@ public class ProtocolRegistration implements IProtocolRegistration { return constructor; } - @Override - public Object read(ByteBuf buffer) { - if (!ByteBufUtils.readBoolean(buffer)) { - return null; - } - Object object = ReflectionUtils.newInstance(constructor); - - for (int i = 0, length = fields.length; i < length; i++) { - Field field = fields[i]; - IFieldRegistration packetFieldRegistration = fieldRegistrations[i]; - ISerializer serializer = packetFieldRegistration.serializer(); - Object fieldValue = serializer.readObject(buffer, packetFieldRegistration); - ReflectionUtils.setField(field, object, fieldValue); - } - return object; + public Object receiver() { + return receiver; } + @Override public void write(ByteBuf buffer, IPacket packet) { if (packet == null) { @@ -100,6 +90,23 @@ public class ProtocolRegistration implements IProtocolRegistration { } } + @Override + public Object read(ByteBuf buffer) { + if (!ByteBufUtils.readBoolean(buffer)) { + return null; + } + Object object = ReflectionUtils.newInstance(constructor); + + for (int i = 0, length = fields.length; i < length; i++) { + Field field = fields[i]; + IFieldRegistration packetFieldRegistration = fieldRegistrations[i]; + ISerializer serializer = packetFieldRegistration.serializer(); + Object fieldValue = serializer.readObject(buffer, packetFieldRegistration); + ReflectionUtils.setField(field, object, fieldValue); + } + return object; + } + public short getId() { return id;