hefeixia
2021-02-18 5b8c95c760840f09910730943b21391e47187315
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
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;
    }
}