From c6cf91aa70101726a792367d6760225c5d7f3512 Mon Sep 17 00:00:00 2001 From: zhangshanxue Date: Wed, 9 Oct 2019 10:33:37 +0800 Subject: [PATCH] =?UTF-8?q?=E9=9D=9E=E6=B3=A8=E8=A7=A3handler=E6=B3=A8?= =?UTF-8?q?=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/ljsd/GameApplication.java | 15 +--- .../chat}/GetChatMessageHandler.java | 2 +- .../chat}/SendChatInfoHandler.java | 2 +- .../handler/equip/RandSoulEquipHandler.java | 1 - .../network/server/ProtocolsManager.java | 33 +++++++- .../ljsd/jieling/util/ClassLoaderHelper.java | 80 +++++++++++++++++++ 6 files changed, 116 insertions(+), 17 deletions(-) rename serverlogic/src/main/java/com/ljsd/jieling/{chat/handler => handler/chat}/GetChatMessageHandler.java (96%) rename serverlogic/src/main/java/com/ljsd/jieling/{chat/handler => handler/chat}/SendChatInfoHandler.java (96%) create mode 100644 serverlogic/src/main/java/com/ljsd/jieling/util/ClassLoaderHelper.java diff --git a/serverlogic/src/main/java/com/ljsd/GameApplication.java b/serverlogic/src/main/java/com/ljsd/GameApplication.java index 80b5d2ad9..28e46122d 100644 --- a/serverlogic/src/main/java/com/ljsd/GameApplication.java +++ b/serverlogic/src/main/java/com/ljsd/GameApplication.java @@ -10,15 +10,12 @@ import com.ljsd.jieling.core.CoreLogic; import com.ljsd.jieling.db.mongo.MongoUtil; import com.ljsd.jieling.db.redis.RedisKey; import com.ljsd.jieling.db.redis.RedisUtil; -import com.ljsd.jieling.handler.BaseHandler; import com.ljsd.jieling.handler.map.MapLogic; import com.ljsd.jieling.logic.GlobalDataManaager; -import com.ljsd.jieling.logic.OnlineUserManager; import com.ljsd.jieling.logic.STableManager; import com.ljsd.jieling.logic.activity.ActivityLogic; import com.ljsd.jieling.logic.dao.GuilidManager; import com.ljsd.jieling.logic.dao.MailingSystemManager; -import com.ljsd.jieling.logic.dao.UserManager; import com.ljsd.jieling.logic.fight.CheckFight; import com.ljsd.jieling.logic.hero.HeroLogic; import com.ljsd.jieling.netty.server.NettyGameServer; @@ -30,7 +27,6 @@ import com.ljsd.jieling.thread.ThreadManager; import com.ljsd.jieling.thread.task.MongoDataHandlerTask; import com.ljsd.jieling.thrift.pool.ThriftPoolUtils; import com.ljsd.jieling.util.KeyGenUtils; -import com.ljsd.jieling.util.SensitiveWordInit; import com.ljsd.jieling.util.SensitivewordFilter; import com.ljsd.jieling.util.TimeUtils; import com.ljsd.jieling.util.http.HttpPool; @@ -43,11 +39,9 @@ import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.EnableScheduling; -import java.io.InputStream; import java.net.URL; import java.text.SimpleDateFormat; import java.util.Date; -import java.util.Map; @Configuration @@ -85,15 +79,10 @@ public class GameApplication { register(configurableApplicationContext); ProtocolsManager protocolsManager = ProtocolsManager.getInstance(); protocolsManager.initCheck(); + // 追加ProtocolsManager消息处理器 注解和非注解 + protocolsManager.initHandler("com.ljsd.jieling.handler",configurableApplicationContext); // protocolsManager.initContext(); - // 追加ProtocolsManager消息处理器 - Map gameHanderMap = configurableApplicationContext.getBeansOfType(BaseHandler.class); - for (BaseHandler handler : gameHanderMap.values()) { - protocolsManager.addHandler(handler); - } - - //http线程池初始化 // HttpPool.init(); //todo 设置开服时间 diff --git a/serverlogic/src/main/java/com/ljsd/jieling/chat/handler/GetChatMessageHandler.java b/serverlogic/src/main/java/com/ljsd/jieling/handler/chat/GetChatMessageHandler.java similarity index 96% rename from serverlogic/src/main/java/com/ljsd/jieling/chat/handler/GetChatMessageHandler.java rename to serverlogic/src/main/java/com/ljsd/jieling/handler/chat/GetChatMessageHandler.java index a71ea7d4e..8bbb4377a 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/chat/handler/GetChatMessageHandler.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/handler/chat/GetChatMessageHandler.java @@ -1,4 +1,4 @@ -package com.ljsd.jieling.chat.handler; +package com.ljsd.jieling.handler.chat; import com.ljsd.jieling.handler.BaseHandler; import com.ljsd.jieling.chat.logic.ChatLogic; diff --git a/serverlogic/src/main/java/com/ljsd/jieling/chat/handler/SendChatInfoHandler.java b/serverlogic/src/main/java/com/ljsd/jieling/handler/chat/SendChatInfoHandler.java similarity index 96% rename from serverlogic/src/main/java/com/ljsd/jieling/chat/handler/SendChatInfoHandler.java rename to serverlogic/src/main/java/com/ljsd/jieling/handler/chat/SendChatInfoHandler.java index 423741d48..13fb2fcc6 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/chat/handler/SendChatInfoHandler.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/handler/chat/SendChatInfoHandler.java @@ -1,4 +1,4 @@ -package com.ljsd.jieling.chat.handler; +package com.ljsd.jieling.handler.chat; import com.ljsd.jieling.handler.BaseHandler; import com.ljsd.jieling.chat.logic.ChatLogic; diff --git a/serverlogic/src/main/java/com/ljsd/jieling/handler/equip/RandSoulEquipHandler.java b/serverlogic/src/main/java/com/ljsd/jieling/handler/equip/RandSoulEquipHandler.java index 78200cb9f..0ac470302 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/handler/equip/RandSoulEquipHandler.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/handler/equip/RandSoulEquipHandler.java @@ -7,7 +7,6 @@ import com.ljsd.jieling.protocols.HeroInfoProto; import com.ljsd.jieling.protocols.MessageTypeProto; import org.springframework.stereotype.Component; -@Component public class RandSoulEquipHandler extends BaseHandler { @Override public MessageTypeProto.MessageType getMessageCode() { diff --git a/serverlogic/src/main/java/com/ljsd/jieling/network/server/ProtocolsManager.java b/serverlogic/src/main/java/com/ljsd/jieling/network/server/ProtocolsManager.java index fca30ea1f..88afd1e93 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/network/server/ProtocolsManager.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/network/server/ProtocolsManager.java @@ -26,12 +26,15 @@ import com.ljsd.jieling.network.session.ISession; import com.ljsd.jieling.protocol.ProtocolsAbstract; import com.ljsd.jieling.protocols.MessageTypeProto; import com.ljsd.jieling.session.GameSession; +import com.ljsd.jieling.util.ClassLoaderHelper; import com.ljsd.jieling.util.MathUtils; import com.ljsd.jieling.util.MessageUtil; import com.ljsd.jieling.util.StringUtil; import com.ljsd.jieling.util.TimeUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.NoSuchBeanDefinitionException; +import org.springframework.context.ConfigurableApplicationContext; import org.springframework.stereotype.Component; import java.lang.reflect.Type; import java.util.*; @@ -50,7 +53,7 @@ public class ProtocolsManager implements ProtocolsAbstract { private static ProtocolsManager instance = new ProtocolsManager(); public static Map gameMessageForLogin = new ConcurrentHashMap<>(); private Map handlers = new HashMap<>(); - + private static ClassLoader classLoader = GameApplication.class.getClassLoader(); private static Set forbidLogin = new HashSet<>(); public final int HANDLER_THREAD_NUM = 50; public HandlerLogicThread[] handlerThreads = new HandlerLogicThread[HANDLER_THREAD_NUM]; @@ -493,5 +496,33 @@ public class ProtocolsManager implements ProtocolsAbstract { } forbidLogin = forbidMap.keySet(); } + + public void initHandler(String pck, ConfigurableApplicationContext configurableApplicationContext){ + List> handlers = new LinkedList<>(); + try + { + ClassLoaderHelper.findLocalClass(pck, BaseHandler.class, classLoader, handlers); + handlers.forEach(hand -> + { + BaseHandler baseHandler = null; + try { + baseHandler = (BaseHandler) configurableApplicationContext.getBean(hand); + } catch (NoSuchBeanDefinitionException e1) { + try { + baseHandler = (BaseHandler) hand.newInstance(); + } catch (Exception ex) { + } + } catch (Exception e) { + e.printStackTrace(); + } + if (null != baseHandler) { + addHandler(baseHandler); + } + }); + } + catch(RuntimeException e2) + { + } + } } diff --git a/serverlogic/src/main/java/com/ljsd/jieling/util/ClassLoaderHelper.java b/serverlogic/src/main/java/com/ljsd/jieling/util/ClassLoaderHelper.java new file mode 100644 index 000000000..08fce7c67 --- /dev/null +++ b/serverlogic/src/main/java/com/ljsd/jieling/util/ClassLoaderHelper.java @@ -0,0 +1,80 @@ +package com.ljsd.jieling.util; + +import java.io.File; +import java.lang.reflect.Modifier; +import java.net.URI; +import java.net.URISyntaxException; +import java.util.List; + +/** + * Description: des + * Author: zsx + * CreateDate: 2019/10/8 17:23 + */ +public class ClassLoaderHelper { + + /** + * 获取指定接口的某个包下的所有实现类(不包括接口和抽象类) + */ + public static void findLocalClass(String packName, Class classinterface, ClassLoader classLoader, List> classes) + { + URI url; + try + { + url = classLoader.getResource(packName.replace(".", "/")).toURI(); + } + catch(URISyntaxException e1) + { + return; + } + File file = new File(url); + file.listFiles((subfile) -> + { + if(subfile.isDirectory()) + { + findLocalClass(packName + "." + subfile.getName(), classinterface,classLoader,classes); + } + if(subfile.getName().endsWith(".class")) + { + Class clazz = null; + try + { + String classname = packName + "." + subfile.getName().replace(".class", ""); + clazz = classLoader.loadClass(classname); + } + catch(ClassNotFoundException e) + { + e.printStackTrace(); + } + if(clazz == null) + { + return false; + } + + if(ClassLoaderHelper.filter(clazz, classinterface)) + { + classes.add(clazz); + return true; + } + } + return false; + }); + } + + /** + * 过滤接口和抽象类 + */ + private static boolean filter(Class clazz, Class filterclass) + { + if(clazz.isInterface()) + { + return false; + } + if(Modifier.isAbstract(clazz.getModifiers())) + { + return false; + } + return filterclass.isAssignableFrom(clazz); + } + +}