Zookeeper-针对比较重要的API内容解析
version
- Zookeeper对ZNode进行事务(可以对数据造成更改的操作)操作时,采用CAS(Compare And Swap)无锁机制来进行数据交换。
- CAS无锁机制相比锁机制具有更改的性能(线程无序等待,减少了线程切换),但是会造成ABA的问题。
- 所以引入了version字段来很轻易的解决这个问题,这点很重要。
ZNode的节点类型(4种)
- 按照生命周期来分包括:持久节点(PERSISTENT)和零时节点(EPHEMERAL)
- 安装节点是否有序来分:有序节点和无序节点(SEQUENTIAL)
API解析
增
- 同步方法
String create(final String path, byte data[], List acl,CreateMode createMode); - 异步方法
void create(final String path, byte data[], List acl,CreateMode createMode, StringCallback cb, Object ctx)
path | data | acl | createMode | cb | ctx |
---|
ZNode路径 | 数据 | 权限组(Ids以提供权限封装) | 节点的创建类型 | 异步结果回调(异步调用) | 回调方法会将提供该参数(异步调用) |
删
- void delete(final String path, int version)
- delete(final String path, int version, VoidCallback cb,Object ctx)
path | version | cb | ctx |
---|
ZNode路径 | 版本号 | 异步结果回调(异步调用) | 回调方法会将提供该参数(异步调用) |
改
- void setData(final String path, byte data[], int version,StatCallback cb, Object ctx)
- Stat setData(final String path, byte data[], int version)
path | data | version | cb | ctx |
---|
ZNode路径 | 数据 | 版本号 | 异步结果回调(异步调用) | 回调方法会将提供该参数(异步调用) |
查
ZNode
- byte[] getData(final String path, Watcher watcher, Stat stat)
- byte[] getData(String path, boolean watch, Stat stat)
- getData(final String path, Watcher watcher,DataCallback cb, Object ctx)
- getData(String path, boolean watch, DataCallback cb, Object ctx)
path | watch | watcher | cb | ctx |
---|
ZNode路径 | 是否监听(复用之前创建注册监听) | 设置监听器 | 异步结果回调(异步调用) | 回调方法会将提供该参数(异步调用) |
Children(获取节点所有一级子节点信息)
- getChildren(String path, boolean watch, Children2Callback cb,Object ctx)
path | watch | watcher | cb | ctx |
---|
ZNode路径 | 是否监听(复用之前创建注册监听) | 设置监听器 | 异步结果回调(异步调用) | 回调方法会将提供该参数(异步调用) |
监听触发
|None | NodeCreated | NodeDeleted | NodeDataChanged | NodeChildrenChanged |
---|
创建连接 | √ | - | - | - |
getData | - | - | - | √ |
getChildren | - | - | - | - |
exists | - | √ | √ | √ |
测试用例
package com.yzz.test;
import org.apache.zookeeper.*;
import org.apache.zookeeper.data.Stat;
import java.util.concurrent.CountDownLatch;
public class EventTest implements Watcher, AsyncCallback.StringCallback {
public static final String ZK_HOST = "192.168.43.210:2181";
CountDownLatch countDownLatch = new CountDownLatch(1);
private ZooKeeper zooKeeper;
@Override
public void process(WatchedEvent event) {
System.out.println(event);
try {
if (Event.KeeperState.SyncConnected == event.getState()) {
Event.EventType eventType = event.getType();
String path = event.getPath();
switch (eventType) {
case None:
if (null == event.getPath()) {
System.out.println("连接成功");
countDownLatch.countDown();
}
break;
case NodeCreated:
zooKeeper.exists(path, true);
System.out.println("节点被创建" + path);
break;
case NodeDeleted:
zooKeeper.exists(path, true);
System.out.println("节点被删除" + event.getPath());
break;
case NodeDataChanged:
Stat stat = new Stat();
zooKeeper.getData(path, true, stat);
System.out.println("节点数据被修改" + path + "[stat: " + stat + " ]");
break;
case NodeChildrenChanged:
zooKeeper.getChildren(path, true);
System.out.println("子节点发生改变" + path);
break;
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
public void doZK() {
try {
zooKeeper = new ZooKeeper(ZK_HOST, 5000, this);
countDownLatch.await();
zooKeeper.create("/ev", "haha".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
zooKeeper.exists("/ev-sync", true);
zooKeeper.create("/ev-sync", "c".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT, this, "1");
Stat stat1 = new Stat();
zooKeeper.getData("/ev", this, stat1);
zooKeeper.getChildren("/ev", true);
zooKeeper.setData("/ev", "hha".getBytes(), stat1.getVersion());
zooKeeper.setData("/ev-sync", "c".getBytes(), -1);
zooKeeper.create("/ev/children", "c".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
zooKeeper.create("/ev/children-1", "c".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
Stat stat2 = new Stat();
zooKeeper.getData("/ev/children-1", this, stat2);
zooKeeper.delete("/ev/children-1", stat2.getVersion());
Stat stat3 = new Stat();
zooKeeper.getData("/ev/children", this, stat2);
zooKeeper.delete("/ev/children", stat3.getVersion());
Stat stat4 = new Stat();
zooKeeper.getData("/ev", this, stat4);
zooKeeper.delete("/ev", stat4.getVersion());
zooKeeper.delete("/ev-sync", -1);
System.in.read();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
EventTest test = new EventTest();
test.doZK();
}
@Override
public void processResult(int rc, String path, Object ctx, String name) {
if (KeeperException.Code.get(rc) == KeeperException.Code.OK) {
System.out.println(path + "--->SUCCESS");
}
}
}