Zookeeper学习-day3-Java 客户端 API的使用
2020-04-08 本文已影响0人
小辉0829
最近公司项目一直在忙,各种项目,从上次更新了Zookeeper后已经有几个月没写点东西了..最近我也正好处在一个工作的过渡阶段.终于可以继续写点东西了..还是zookeeper 我们跟着上前一篇的继续咯..
上次写到Zookeeper的8个读取节点方法,今天我们来一一道来.
闲话不多说了,我们直接上代码
image.png /**
* @param path
* @param watcher explicit watcher
* @param watch whether need to watch this node
* @param cb a handler for the callback
* @param ctx context to be provided to the callback
* @param stat stat of the znode designated by path
*/
1 - zookeeper API获取子节点列表, 使用同步(sync)接口
public class ZookeeperGetChilrenSync implements Watcher {
private static Logger logger = LoggerFactory.getLogger(ZookeeperGetChilrenSync.class);
private static CountDownLatch latch = new CountDownLatch(1);
static ZooKeeper zk = null;
public static void main(String[] args) throws Exception {
String path = "/zk-edu-test";
zk = new ZooKeeper("192.168.131.134:2181", 5000, new ZookeeperGetChilrenSync());
latch.await();
zk.create(path, "".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
zk.create(path + "/child-1", "".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
List<String> childrenList = zk.getChildren(path, true);
System.out.println(childrenList);
zk.create(path + "/child-2", "".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
Thread.sleep(Integer.MAX_VALUE);
}
@Override
public void process(WatchedEvent event) {
logger.info("===== event: {}", event);
if (Watcher.Event.KeeperState.SyncConnected == event.getState()) {
if (Watcher.Event.EventType.None == event.getType() && null == event.getPath()) {
latch.countDown();
} else if (event.getType() == Watcher.Event.EventType.NodeChildrenChanged) {
try {
System.out.println("ReGet Child :" + zk.getChildren(event.getPath(), true));
} catch (KeeperException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
image.png
关于Watch, ZooKeeper服务端在向客户端发送Wather "NodeChildrenChange" 事件通知的时候, 发出一个通知,而不会把节点的变化情况发送给客户端,需要客户端自己重新获取. 另外, 由于Watcher通知是一次性的,即一旦触发一次通知后,该Watcher就失败了. 因此客户端需要反复注册