非注解handler注入

back_recharge
zhangshanxue 2019-10-09 10:33:37 +08:00
parent f9dab7ddae
commit c6cf91aa70
6 changed files with 116 additions and 17 deletions

View File

@ -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<String, BaseHandler> gameHanderMap = configurableApplicationContext.getBeansOfType(BaseHandler.class);
for (BaseHandler handler : gameHanderMap.values()) {
protocolsManager.addHandler(handler);
}
//http线程池初始化
// HttpPool.init();
//todo 设置开服时间

View File

@ -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;

View File

@ -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;

View File

@ -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<HeroInfoProto.SoulRandRequest> {
@Override
public MessageTypeProto.MessageType getMessageCode() {

View File

@ -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<MessageTypeProto.MessageType, String> gameMessageForLogin = new ConcurrentHashMap<>();
private Map<Integer, BaseHandler> handlers = new HashMap<>();
private static ClassLoader classLoader = GameApplication.class.getClassLoader();
private static Set<Integer> 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<Class<?>> 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)
{
}
}
}

View File

@ -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<Class<?>> 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);
}
}