package chat.server; import javax.servlet.ServletContext; import org.apache.log4j.Logger; import chat.module.ModuleLoader; import chat.server.netty.NettyAcceptor; import frame.persist.DatasuorceLoader; import frame.persist.NamedSQLLoader; import io.netty.util.ResourceLeakDetector; public class ServerInstance { private static Logger logger; private static ServerInstance instance; private String version; public static ServerState state; static { logger = Logger.getLogger(ServerInstance.class); } public ServerInstance(ServletContext servletContext) { version = "1.0.0.1"; } public static void startService(ServletContext servletContext) { try { instance = new ServerInstance(servletContext); instance.start(); } catch (Exception e) { logger.error(e); e.printStackTrace(); } } public static void stopService() { try { if(instance != null) { instance.stop(); } } catch (Exception e) { logger.error(e); e.printStackTrace(); } } public void start() throws Exception { try { state = ServerState.Starting; //1. write info logger.info("server is startting..."); logger.info("server root path is " + Configer.getPath_Application()); //2. resource leak ResourceLeakDetector.setLevel(ResourceLeakDetector.Level.ADVANCED); //3. data source and SQL DatasuorceLoader.staticLoad(); NamedSQLLoader.staticLoad(); //4. schedule // dbScheduler、imBusinessScheduler、callbackScheduler //5. ModuleLoader.load(); //6、 start listener list NettyAcceptor.start(); state = ServerState.Start; } catch (Exception e) { e.printStackTrace(); } finally { printStartUpMessage(); } } public void stop() { logger.info("internal server is stopping..."); NettyAcceptor.stop(); logger.info("internal server has been stopped"); } public void restart() throws Exception { stop(); start(); } private static String echoString(String word, int count) { StringBuilder result = new StringBuilder(); for (int i = 1; i <= count; i++) { result.append(word); } return result.toString(); } private void printStartUpMessage() { int length_total = 40; long total = Math.round((Runtime.getRuntime().totalMemory()) / (1024.0 * 1024)); long max = Math.round((Runtime.getRuntime().maxMemory()) / (1024.0 * 1024)); String envirenment = Configer.getString("EnvironmentName"); System.out.println("--->>> " + envirenment + " --->>>"); System.out.println(echoString("*", length_total + 2)); printMessage("Total Memory:" + total + "M", length_total); printMessage("Max Memory:" + max + "M", length_total); printMessage(version, length_total); System.out.println(echoString("*", length_total + 2)); } private void printMessage(String message, int totalLength) { MessagePos messagePos = new MessagePos(totalLength, message); System.out.println("*" + echoString(" ", messagePos.length_begin) + message + echoString(" ", messagePos.length_end) + "*"); } private class MessagePos { private int length_begin; private int length_end; private int length_message; public MessagePos(int totalLength, String message) { length_message = message.length(); length_begin = (totalLength - length_message) / 2; length_end = totalLength - length_begin - length_message; } } public static boolean isStart() { return ServerState.Start == state; } }