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)
发表回复
