乐趣区

关于mysql:高并发-高性能-高可用-MySQL-实战

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

    }

}

退出移动版