package com.ljsd; import cn.thinkingdata.analytics.TDAnalytics; import cn.thinkingdata.analytics.TDBatchConsumer; import cn.thinkingdata.analytics.inter.ITDConsumer; import com.ljsd.commonFunc.GsGuildInfoCacheLoader; import com.ljsd.jieling.config.json.MongoConfiguration; import com.ljsd.jieling.config.json.MongoProperties; import com.ljsd.jieling.config.json.ServerConfiguration; import com.ljsd.jieling.config.json.ServerProperties; import com.ljsd.jieling.config.json.*; 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.ktbeans.ReportUtil; import com.ljsd.jieling.logic.dao.ServerConfig; import com.ljsd.jieling.logic.dao.root.GlobalSystemControl; import com.ljsd.jieling.logic.rankReward.RankRewardLogic; import com.ljsd.jieling.network.NetManager; import com.ljsd.jieling.util.ConfigurableApplicationContextManager; import com.ljsd.worldmanager.WorldServerListListener; import org.I0Itec.zkclient.ZkClient; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.EnableScheduling; import util.TimeUtils; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Scanner; @Configuration @EnableAutoConfiguration @ComponentScan @EnableScheduling public class GameApplication { private static final Logger LOGGER = LoggerFactory.getLogger(GameApplication.class); public static ServerProperties serverProperties; public static MongoProperties mongoProperties; public static int serverId = 0; public static boolean openTdAnalytics = false; public static int areaId = 0; public static boolean start = false; public static ServerConfig serverConfig; public static String serverName; public static ZkClient zkClient; public static TDAnalytics tdAnalytics; public static void main(String[] args) throws Exception { //关闭会话钩子 Runtime.getRuntime().addShutdownHook(new Thread(() -> { System.out.println("jvm 进程退出"); zkClient.close(); })); start = true; ConfigurableApplicationContextManager.init(args); //init servercfg ServerConfiguration serverConfiguration = ConfigurableApplicationContextManager.getBean(ServerConfiguration.class); MongoConfiguration mongoConfiguration = ConfigurableApplicationContextManager.getBean(MongoConfiguration.class); serverProperties = serverConfiguration.getServerProperties(); mongoProperties = mongoConfiguration.getMongoProperties(); zkClient = new ZkClient(serverProperties.getZkAddr(), serverProperties.getZkConnectTimeout()); serverId = serverProperties.getId(); openTdAnalytics = serverProperties.isOpenTdAnalytics(); ITDConsumer consumer = generateBatchConsumer(serverProperties.getTdUrl(), serverProperties.getTdAppId()); if (consumer != null) { tdAnalytics = new TDAnalytics(consumer, false); } LOGGER.info("ServerProperties ->{},coreIp=>{}", serverProperties.toString()); MongoUtil.getInstence().init(); GlobalSystemControl.getGlobalSystemControl(); GameLogicService.getInstance().init(); serverName = MongoUtil.getInstence().getServerNameById(serverProperties.getId()); //设置开服时间 setRegisterTime();// might loop GameLogicService.getInstance().onStart(); //每隔五分钟重载一次工会缓存 GsGuildInfoCacheLoader.loadGuildInfoCache(); //初始化榜单结算信息 RankRewardLogic.getInstance().init(); //监听世界服列表 new WorldServerListListener().start(); new ReportUtil().start(); NetManager.getInstance().init(); //控制台gm Scanner sc = new Scanner(System.in); while (sc.hasNext()) { try { String cmd = sc.nextLine(); if (cmd.startsWith("//")) { System.out.println("gmgmgm:" + cmd.substring(2)); String cmd2 = cmd.substring(2); GmService.exeCmd(cmd2); } } catch (Exception e) { System.out.print("gmException" + 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 = 60; //开服白名单时间 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 close() throws Exception { start = false; NetManager.getInstance().exit(); ConfigurableApplicationContextManager.getInstance().exit(); } public static ITDConsumer generateBatchConsumer(String url, String appId) { ITDConsumer consumer = null; try { TDBatchConsumer.Config config = new TDBatchConsumer.Config(); config.setBatchSize(1); config.setMaxCacheSize(1); consumer = new TDBatchConsumer(url, appId, config); } catch (Exception ignored) { } return consumer; } }