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(); } }
}
}