package com.sw; import java.io.IOException; import java.util.List; import org.apache.log4j.Logger; import org.apache.zookeeper.KeeperException; import org.apache.zookeeper.WatchedEvent; import org.apache.zookeeper.Watcher; import org.apache.zookeeper.Watcher.Event.EventType; import org.apache.zookeeper.ZooKeeper; public class WatchClient implements Watcher, Runnable{ private static final Logger logger = Logger.getLogger(WatchClient.class); public static final String PATH = "/root";// 所要监控的结点 private static ZooKeeper zk; private static List<String> nodeList;// 所要监控的结点的子结点列表 public static void main(String[] args) throws Exception { WatchClient client = new WatchClient(); Thread th = new Thread(client); th.start(); } public void run() { try { zk = new ZooKeeper("ip:4181", 21810,this); /** * 持续监控PATH下的结点 */ while (true) { try { zk.exists(PATH, this);//所要监控的主结点 nodeList = zk.getChildren(PATH, this); System.err.println(nodeList); zk.exists(PATH , this); Thread.sleep(1000);// sleep一会,减少CUP占用率 } catch (KeeperException | InterruptedException e) { logger.warn(e.getMessage()); } } } catch (IOException e) { logger.warn(e.getMessage()); } } public void process(WatchedEvent event) { System.err.println(event.getType()); String path = event.getPath(); if(path==null){ return ; } // 结点数据改变之前的结点列表 List<String> nodeListBefore = nodeList; // 主结点的数据发生改变时 if (event.getType() == EventType.NodeDataChanged) { logger.info("Node data changed:" + path); } if (event.getType() == EventType.NodeDeleted){ logger.info("Node deleted:" + path); } if(event.getType()== EventType.NodeCreated){ logger.info("Node created:"+path); } // 获取更新后的nodelist try { nodeList = zk.getChildren(path, false); } catch (KeeperException e) { System.out.println(path+" has no child, deleted."); } catch (InterruptedException e) { e.printStackTrace(); } List<String> nodeListNow = nodeList; // 增加结点 if (nodeListBefore.size() < nodeListNow.size()) { for (String str : nodeListNow) { if (!nodeListBefore.contains(str)) { logger.info("Node created:" + path + "/" + str); } } } } }
ZooKeeper(java api watch)
发表回复