Zookeeper系列2 原生API 以及核心特性watcher

原生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

watcherZookeeperwatch是一次性的!!!监听一次就失效

有一下两类事件(节点相关的)以及连接zookeeper相关的状态

我们主要重点关注节点相关

 

可以设置观察的操作:exists,getChildren,getData

 

可以触发观察的操作:create,delete,setData

 

znode以某种方式发生变化时,“观察”(watch)机制可以让客户端得到通知.可以针对ZooKeeper服务的“操作”来设置观察,该服务的其他 操作可以触发观察.

 

这里需要需要注意的是exists可以监控不存在的节点,当创建了该节点以后,则这个观察会被触发,之前的那个客户端就会得到通知.getChildren,getData不可以

 

另外exists(path,true)监控的就是该path节点创建 删除 修改

getChildren(path,watcher)监控的就是该path节点下的子节点的变化(子节点的创建、修改、删除都会监控到)这里有一点不是很友好,他们对应的事件都是一个 。我们需要自己来判断

 这里可以用过保存上次getChildren获得的值 ,两个通过比较就知道具体是什么变化的了。

最后注意 :监控只是一次性的,如果要一直监控,需要多次设置。

 

posted on 2017-09-10 19:31  一只小蜗牛12138  阅读(146)  评论(0编辑  收藏  举报

导航