package com.metazion.jgd; import com.metazion.jgd.logic.LogicService; import com.metazion.jgd.net.NetworkService; import com.metazion.jgd.util.JgdLogger; public class AppLogin { public static void main(String[] args) { final boolean result = AppLogin.getInstance().init(); if (result) { AppLogin.getInstance().start(); AppLogin.getInstance().tick(); AppLogin.getInstance().stop(); } System.exit(0); } private static AppLogin singleton = new AppLogin(); public static AppLogin getInstance() { return singleton; } public static LogicService getLogicService() { return getInstance().logicService; } public static NetworkService getNetworkService() { return getInstance().networkService; } private static final int STOPWAITINTERVAL = 30 * 1000; // 优雅关闭等待间隔(ms) private static final int TICKSTANDARDINTERVAL = 10; // 逻辑循环标准间隔(ms) private static final int TICKMAXIMUMINTERVAL = 50; // 逻辑循环最大间隔(ms) private volatile boolean stopDesired = false; // 优雅关闭 private volatile long stopBeginTime = 0; private long lastTickTime = 0; private LogicService logicService = new LogicService(); private NetworkService networkService = new NetworkService(); private AppLogin() { } public boolean init() { JgdLogger.getLogger().fatal("Login Server Init..."); boolean result = logicService.init(); if (!result) { return false; } result = networkService.init(); if (!result) { return false; } return true; } public void start() { JgdLogger.getLogger().fatal("Login Server Start..."); printInfo(); logicService.start(); networkService.start(); } public void stop() { JgdLogger.getLogger().fatal("Login Server Stop..."); logicService.stop(); networkService.stop(); } public void tick() { JgdLogger.getLogger().fatal("Login Server Tick..."); while (true) { final long now = System.currentTimeMillis(); if (stopDesired) { if (now - stopBeginTime >= STOPWAITINTERVAL) { break; } } if (lastTickTime == 0) { lastTickTime = now; } final long interval = now - lastTickTime; if (interval < TICKSTANDARDINTERVAL) { sleep(TICKSTANDARDINTERVAL - interval); continue; } if (interval > TICKMAXIMUMINTERVAL) { JgdLogger.getLogger().warn("Login Server Tick: abnormal interval[{}]", interval); } lastTickTime = now; logicService.tick(interval); } } public void shutdownGracefully() { JgdLogger.getLogger().fatal("Login Server shutdownGracefully..."); stopDesired = true; } public void printInfo() { JgdLogger.getLogger().fatal("System Info: processors[{}]", Runtime.getRuntime().availableProcessors()); JgdLogger.getLogger().fatal("System Info: max memory[{}]", Runtime.getRuntime().maxMemory()); JgdLogger.getLogger().fatal("System Info: total memory[{}]", Runtime.getRuntime().totalMemory()); JgdLogger.getLogger().fatal("System Info: free memory[{}]", Runtime.getRuntime().freeMemory()); } private void sleep(long milliseconds) { try { Thread.sleep(milliseconds); } catch (InterruptedException e) { e.printStackTrace(); } } }