原生API 增删改查询
public class ZkBaseTest {
static final String CONNECT_ADDR = "192.168.0.120";
static final CountDownLatch countDownLatch = new CountDownLatch(1); public static void main(String[] args) throws Exception { // 获取zookeeper对象
ZooKeeper zk = new ZooKeeper(CONNECT_ADDR, 20000, new Watcher() { @Override
public void process(WatchedEvent event) {
KeeperState state = event.getState();
EventType type = event.getType();
if (KeeperState.SyncConnected == state) {
if (EventType.None == type) { countDownLatch.countDown();
}
} } });
countDownLatch.await(); // 一直阻塞直到链接成功 zk.create("/test", "testdata".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); byte[] data = zk.getData("/test", false, null);
System.out.println("data " + new String(data)); zk.setData("/test", "newdata".getBytes(), -1);
byte[] afterData = zk.getData("/test", false, null);
System.out.println("afterData " + new String(afterData)); zk.delete("/test", -1); //删除过程中,需要版本检查 -1表示跳过版本检查
zk.close();
} }
注意:节点类型分为四种 临时,临时顺序 持久 持久顺序
临时节点的有效期 是当次连接开始到当次连接结束。
实际开发中,我们一般不会使用原生APi去开发,超级不好用。一般会使用
Curator或者zkclient 后面都会介绍到
Watcher
之前提到,监控机制是zookeeper的一个核心特性。是一次性触发的。
当watch监控的数据或者节点发生变化,会通知设置了该监控的client,
即watcher。Zookeeper的watch是一次性的!!!监听一次就失效
有一下两类事件(节点相关的)以及连接zookeeper相关的状态
我们主要重点关注节点相关
可以设置观察的操作:exists,getChildren,getData
可以触发观察的操作:create,delete,setData
znode以某种方式发生变化时,“观察”(watch)机制可以让客户端得到通知.可以针对ZooKeeper服务的“操作”来设置观察,该服务的其他 操作可以触发观察.
这里需要需要注意的是:exists可以监控不存在的节点,当创建了该节点以后,则这个观察会被触发,之前的那个客户端就会得到通知.而getChildren,getData不可以
另外exists(path,true)监控的就是该path节点创建 删除 修改
而getChildren(path,watcher)监控的就是该path节点下的子节点的变化(子节点的创建、修改、删除都会监控到)这里有一点不是很友好,他们对应的事件都是一个 。我们需要自己来判断
这里可以用过保存上次getChildren获得的值 ,两个通过比较就知道具体是什么变化的了。
最后注意 :监控只是一次性的,如果要一直监控,需要多次设置。