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

    }

}