download:高并发 高性能 高可用 MySQL 实战
// 特点界说 // 用来接管客户端连接的服务端的 ServerSocket private ServerSocket server; // 用来办理解决客户端申请的线程的线程池 private ExecutorService threadPool; // 保留所有客户端发送过去配对日志的文件 private File serverLogFile; // 消息行列 private BlockingQueuemessageQueue = new LinkedBlockingQueue(); public DMSServer() throws Exception{try {
System.out.println("服务端正在初始化..."); //1 解析配备文件 server-config.xml Map config = loadConfig(); //2 根据配备文件内容初始化特点 init(config);
System.out.println("服务端初始化完结...");
} catch (Exception e) {System.out.println("初始化服务端得胜!"); throw e;
}
} /**
- 构造方法初始化第一步,解析配备文件
- @return 回来的 Map 中保留的是配备文件中的
- 每一条内容,其中 key: 标签的姓名,
- value 为标签两头的文本
-
@throws Exception
*/ private Map loadConfig() throws Exception{ try { SAXReader reader = new SAXReader(); Document doc = reader.read(new File(“server-config.xml”)); Element root = doc.getRootElement();Map config = new HashMap(); /* * 获取标签中的所有子标签 * 并将每一个子标签的姓名作为 key, 两头的 * 文本作为 value 存入 Map 调集 */ Listlist = root.elements(); for(Element e : list){String key = e.getName(); String value = e.getTextTrim(); config.put(key, value); } return config;
} catch (Exception e) {
System.out.println("解析配备文件反常!"); e.printStackTrace(); throw e;
}
} /**
- 构造方法初始化第二步, 根据配备项初始化特点
- @param config
-
@throws Exception
/ private void init(Map config) throws Exception{/- 用配备文件中的初始化特点:serverLogFile
- 用配备文件中的初始化特点:threadPool,这儿创立固定大小线程池。该值作为线程池线程数量
- 用配备文件中的初始化特点:server, 这儿这个值为 ServerSocket 的服务端口
*/ this.server = new ServerSocket(
Integer.parseInt(config.get(“serverport”))
); this.serverLogFile = new File(
config.get("logrecfile")
); this.threadPool = Executors.newFixedThreadPool(
Integer.parseInt(config.get("threadsum"))
);
} /**
- 服务端开始工作的方法
-
@throws Exception
/ public void start() throws Exception{ /- 实现要求:
- 首要单独动员一个线程,用来运行 SaveLogHandler
- 这个工作,目标是保留所有配对日志
- 而后开始循环监听服务端端口,一旦一个客户端连接了,
- 就实例化一个 ClientHander, 而后将该工作交给线程池
- 使其调配线程来解决与该客户端的交互。
-
*/ try {
System.out.println(“ 服务端开始工作 …”);
SaveLogHandler slh=new SaveLogHandler(); new Thread(slh).start(); while(true){Socket socket=server.accept(); threadPool.execute(new ClientHandler(socket));
}
} catch (Exception e) {
e.printStackTrace(); throw e;
}
} public static void main(String[] args) {try { DMSServer server = new DMSServer();
server.start();} catch (Exception e) {System.out.println("动员服务端得胜!");
}
} /**
- 该线程负责从消息行列中取出每一条配对日志,
- 并存入到 serverLogFile 文件
-
@author Administrator
*
*/ private class SaveLogHandler implements Runnable{public void run(){PrintWriter pw = null; try {pw = new PrintWriter( new FileOutputStream(serverLogFile,true) ); while(true){if(messageQueue.size()>0){pw.println(messageQueue.poll()); }else{pw.flush(); Thread.sleep(500); } } } catch (Exception e) {e.printStackTrace(); } finally{if(pw != null){pw.close(); } }
}
}