/** * */ package com.cattles.clusterMonitoring.heartbeat; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import java.net.ServerSocket; import java.net.Socket; //import com.cattles.cloudplatforms.factory.DealwithStopVmFactory; /** * @author xiongrong 用法:监控节点服务器,侦听节点心跳 */ public class NodeServer extends Thread { public static final Log logger = LogFactory.getLog(NodeServer.class); // 当前的连接数和工作线程数 static int workThreadNum = 0; static int socketConnect = 0; private ServerSocket serverSocket; // 服务的IP // private static final String SERVER = "172.16.254.180"; // 端口 // private static final int PORT = 60001; public NodeServer() { //确保ctrl+c的时候会关闭serverSocket Runtime.getRuntime().addShutdownHook(this); } public void run() { // 绑定端口,并开始侦听用户心跳包 /*serverSocket = startListenUserReport(ReadManagerConfig.heartbeatPort); if (serverSocket == null) { logger.error("server socket error!"); return; } // 等待用户心跳包请求 while (true) { Socket socket = null; try { socketConnect = socketConnect + 1; // 接收客服端的连接 socket = serverSocket.accept(); // 为该连接创建一个工作线程 Thread workThread = new Thread(new Handler(socket)); // 启动工作线程 workThread.start(); } catch (IOException e) { e.printStackTrace(); } }*/ } /** * 创建一个ServerSocket来侦听用户心跳包请求 */ public ServerSocket startListenUserReport(int port) { /*try { ServerSocket serverSocket = new ServerSocket(); if (!serverSocket.getReuseAddress()) { serverSocket.setReuseAddress(true); } serverSocket.bind(new InetSocketAddress( ReadManagerConfig.heartbeatServer, port)); logger.info("we start moniter user's heartbeat in " + serverSocket.getLocalSocketAddress()); return serverSocket; } catch (IOException e) { logger.error("port " + port + " have used!"); if (serverSocket != null) { if (!serverSocket.isClosed()) { try { serverSocket.close(); } catch (IOException e1) { logger.error(e1.getMessage()); } } } }*/ return serverSocket; } /** * @author xiongrong 用法:工作线程类 */ class Handler implements Runnable { private Socket socket; public Handler(Socket socket) { this.socket = socket; } public void run() { /*Node node = null; try { workThreadNum = workThreadNum + 1; logger.info(workThreadNum + " connect:" + socket.getInetAddress() + ":" + socket.getPort()); while (true) { InputStream in = socket.getInputStream(); byte[] bin = new byte[300]; int length = 0; while ((length = in.read(bin)) != -1) { logger.debug("get byte length:" + length); node = Persistence.getBytes(bin); logger.debug("node ip is:" + node.getIp()); logger.debug("node free cpu is:" + node.getFree_cpu()); logger.debug("node df is:" + node.getDf()); logger.debug("node used df is:" + node.getUsed_df()); logger.debug("node free df is:" + node.getFree_df()); logger.debug("node ram is:" + node.getRam()); logger.debug("node used ram is:" + node.getUsed_ram()); logger.debug("node free ram is:" + node.getFree_ram()); // 用于检测socket网络远端是否断开 socket.sendUrgentData(0xFF); } // if (Constant.nodeMap.containsKey(node.getIp())) // Constant.nodeMap.remove(node.getIp()); Constant.nodeMap.put(node.getIp(), node); try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } } } catch (IOException e) { //对停止心跳的处理 if(node != null){ try { //删除内存中该节点的记录 Constant.nodeMap.remove(node.getIp()); DealwithStopVm dsv = DealwithStopVmFactory.getInstance(ReadManagerConfig.platform); int type = dsv.stopVmType(node.getIp()); logger.info("###################" + node.getIp() + " vm have stoped!"); if(type == 1){ logger.info("Now,we dealwith falkon server " + node.getIp() + " who have stoped!"); dsv.dealwithSotpServer(node.getIp()); } if(type == 2){ logger.info("Now,we dealwith falkon worker " + node.getIp() + " who have stoped!"); dsv.dealwithStopWorker(node.getIp()); } logger.info("###################Dealwith " + node.getIp() + " Finshed!"); //删除内存中该节点的记录 //Constant.nodeMap.remove(node.getIp()); } catch (OpennebulaException e1) { logger.error(e1.getMessage()); } catch (Exception e2) { logger.error(e2.getMessage()); } } // if (node != null) // Constant.nodeMap.remove(node.getIp()); // logger.info("user have disconnect!"); } finally { if (socket != null) { try { // 关闭socket socket.close(); } catch (IOException e) { e.printStackTrace(); } } } */ } } /** * author:xiong rong 功能: 查询一个用户是否在线 * * @param name */ public boolean isAlive(String name) { //return Constant.nodeMap.containsKey(name); return false; } public static void main(String arg[]) { NodeServer server = new NodeServer(); System.out.println("..............start server................."); server.start(); } }