package com.ljsd; import com.google.gson.Gson; import com.ljsd.common.mogodb.util.MongoKeys; import com.ljsd.jieling.config.json.CoreSettings; import com.ljsd.jieling.config.json.ServerConfiguration; import com.ljsd.jieling.config.json.ServerProperties; 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.map.MapLogic; import com.ljsd.jieling.logic.GlobalDataManaager; 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.fight.CheckFight; import com.ljsd.jieling.logic.hero.HeroLogic; import com.ljsd.jieling.netty.server.NettyGameServer; import com.ljsd.jieling.network.NettyProperties; import com.ljsd.jieling.network.NettyServerAutoConfiguration; import com.ljsd.jieling.network.server.ProtocolsManager; import com.ljsd.jieling.network.session.ISessionFactory; 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.SensitivewordFilter; import util.TimeUtils; import com.ljsd.jieling.util.http.HttpPool; import com.ljsd.jieling.logic.dao.ServerConfig; import manager.STableManager; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.EnableScheduling; import java.net.URL; import java.text.SimpleDateFormat; import java.util.Date; @Configuration @EnableAutoConfiguration @ComponentScan @EnableScheduling public class GameApplication { private static SpringApplication app = null; private static ConfigurableApplicationContext configurableApplicationContext = null; private static final Logger LOGGER = LoggerFactory.getLogger(GameApplication.class); public static ServerProperties serverProperties; private static NettyGameServer nettyServer = null; public static int serverId = 0; public static int areaId = 0; public static boolean start = false; private static Gson gson = new Gson(); public static ServerConfig serverConfig; public static void main(String[] args) throws Exception { start = true; app = new SpringApplication(GameApplication.class); app.setRegisterShutdownHook(false); app.setWebEnvironment(false); configurableApplicationContext = app.run(args); ServerConfiguration serverConfiguration = configurableApplicationContext.getBean(ServerConfiguration.class); serverProperties = serverConfiguration.getServerProperties(); serverId = serverProperties.getId(); CoreSettings coreSettings = configurableApplicationContext.getBean(CoreSettings.class); GameApplication.areaId = coreSettings.getArea(); LOGGER.info("ServerProperties ->{},coreIp=>{}", serverProperties.toString()); RedisUtil.getInstence().init(configurableApplicationContext); MongoUtil.getInstence().init(configurableApplicationContext); //注册消息处理方法 register(configurableApplicationContext); ProtocolsManager protocolsManager = ProtocolsManager.getInstance(); protocolsManager.initCheck(); // 追加ProtocolsManager消息处理器 注解和非注解 protocolsManager.initHandler("com.ljsd.jieling.handler",configurableApplicationContext); // protocolsManager.initContext(); //http线程池初始化 // HttpPool.init(); //todo 设置开服时间 setRegisterTime();// might loop GuilidManager.init(); STableManager.initialize("config"); //mongo异步数据处理线程 MongoDataHandlerTask.init(configurableApplicationContext); //初始化邮件 MailingSystemManager.init(configurableApplicationContext); ThreadManager threadManager = ThreadManager.getInstance(); threadManager.init(configurableApplicationContext); MapLogic.getInstance().init(configurableApplicationContext); MongoKeys.initmongoKey(); SensitivewordFilter.init(); HttpPool.init(); // 加载lua文件 CheckFight.getInstance().init("luafight/BattleMain.lua"); final NettyServerAutoConfiguration netServerConfig = configurableApplicationContext.getBean(NettyServerAutoConfiguration.class); NettyProperties properties = netServerConfig.getNettyProperties(); KeyGenUtils.setMachineNum(serverConfiguration.getServerProperties().getNum()); ActivityLogic.getInstance().checkActiviyStatus(); //初始化cdk CoreLogic.getInstance().checkCoreCdk(); ThriftPoolUtils.getInstance().initContext(configurableApplicationContext); GlobalDataManaager.getInstance().whenServerStart(configurableApplicationContext); URL resource = HeroLogic.class.getClassLoader().getResource("mingan.txt"); if(resource!=null){ LOGGER.info(resource.getFile()); } Runtime.getRuntime().addShutdownHook(new Thread() { @Override public void run() { Thread.currentThread().setName("addShutdownHook"); close(); } }); try { LOGGER.info("main->CoreApplication start..."); ISessionFactory sessionFactory = new ISessionFactory(); nettyServer = new NettyGameServer(properties.getTcpPort(), properties.getReadTimeout(), properties.getWriteTimeout(), properties.getAllTimeout(),ProtocolsManager.getInstance(), sessionFactory); nettyServer.start(); } catch (Exception e) { LOGGER.error("main->msg={}", e.getMessage(), e); } } private static void setRegisterTime() throws Exception { ServerConfig serverConfigTmp = MongoUtil.getInstence().getMyMongoTemplate().findById(1, ServerConfig.class); if( null == serverConfigTmp ){ serverConfigTmp = new ServerConfig(); if (GameApplication.serverProperties.isAutoOpen()) { int startbefore = 0; //开服白名单时间 long needtime = TimeUtils.DifferMintFromLast(RedisUtil.getInstence().getObject(GameApplication.serverId + RedisKey.Delimiter_colon + RedisKey.AUTOOPENTIME ,"",String.class,-1)); while (needtime - startbefore > 0) { long sleepTime = needtime - startbefore; try { LOGGER.error("预计" + sleepTime + "分钟后开服"); Thread.sleep(1000 * 60); } catch (Exception e) { LOGGER.error("休眠异常", e.getMessage(), e); } needtime = TimeUtils.DifferMintFromLast(RedisUtil.getInstence().getObject(GameApplication.serverId + RedisKey.Delimiter_colon + RedisKey.AUTOOPENTIME ,"",String.class,-1)); } } SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); long serverOenTime = TimeUtils.getAppointTime(0); String format = simpleDateFormat.format(serverOenTime); serverConfigTmp.setOpenTime(format); serverConfigTmp.setCacheOpenTime(serverOenTime); serverConfigTmp.setId(1); serverConfigTmp.setWorldLevel(1); MongoUtil.getInstence().getMyMongoTemplate().saveWithoutMongoRoot(serverConfigTmp); }else{ SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String openTime = serverConfigTmp.getOpenTime(); Date date = simpleDateFormat.parse(openTime); serverConfigTmp.setCacheOpenTime(date.getTime()); } serverConfig = serverConfigTmp; } public static void register(ConfigurableApplicationContext configurableApplicationContext){ CoreSettings coreSettings = configurableApplicationContext.getBean(CoreSettings.class); String ip = coreSettings.getIp(); int port = coreSettings.getGmport(); String rpcUrl = ip + ":" + port; RedisUtil.getInstence().set(RedisKey.LOGIC_SERVER_INFO+RedisKey.Delimiter_colon+GameApplication.serverId,gson.toJson(rpcUrl)); } private static void close() { start = false; LOGGER.info("close->QuartzManager.getInstance().shutdownJob-------------------"); try { nettyServer.stop(); } catch (Exception e) { LOGGER.error("close->msg={}", e.getMessage(), e); } LOGGER.info("close->nettyServer.stop-------------------"); configurableApplicationContext.close(); LOGGER.info("-------------------configurableApplicationContext.close-------------------"); } }