前言
- 上一篇文章中,小编简单的介绍了zookeeper集群的搭建,这篇文章了,小编继续带读者探索zookeeper的基本操作。在zookeeper的原生的API中,他的增删改查操作都有同步和异步的两种方式,下面是具体的代码。
1、建立连接
/** zookeeper地址 */
static final String CONNECT_ADDR = "192.168.141.140:2181,192.168.141.141:2181,192.168.141.143:2181";
/** session超时时间 */
static final int SESSION_OUTTIME = 5000;
/** 信号量,阻塞程序执行,用于等待zookeeper连接成功,发送成功信号 */
static final CountDownLatch connectedSemaphore = new CountDownLatch(1);
public static void main(String[] args) throws Exception{
ZooKeeper zk = new ZooKeeper(CONNECT_ADDR, SESSION_OUTTIME, new Watcher(){
@Override
public void process(WatchedEvent event) {
KeeperState keeperState = event.getState();
EventType eventType = event.getType();
if(KeeperState.SyncConnected == keeperState){
if(EventType.None == eventType){
connectedSemaphore.countDown();
System.out.println("zk 建立连接");
}
}
}
});
connectedSemaphore.await();
zk.close();
2、创建节点
String result=zk.create("/testRoot", "testRoot".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT)
- 由于原生的API在创建节点时不支持递归创建,所以当我们创建子节点的时候只能在父节点的基础上创建,代码如下。
zk.create("/testRoot/children", "children data".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT)
- 在创建节点的时候,我们需要将节点的value转化成字节数组,然后再将字节数组的值存入zookeeper的该节点中,当取该节点的时候,我们取的也是字节数组,我们需要将数组的值重新还原才能显示出来。
3、获取节点
获取父节点的值
byte[] data = zk.getData("/testRoot", false, null);
获取子节点的值
List<String> children = zk.getChildren("/testRoot", false);
for (String path : children) {
System.out.println(path);
String realPath ="/testRoot/" + path;
System.out.println(new String(zk.getData(realPath, false, null)));
}
4、修改节点的值
zk.setData("/testRoot", "modify data root".getBytes(), -1)
5、删除节点
zk.delete("/testRoot", -1,
new AsyncCallback.VoidCallback() {
@Override
public void processResult(int rc, String path, Object ctx) {
System.out.println(rc);
System.out.println(path);
System.out.println(ctx);
}
}, "这是回调函数中传入的参数");
小结
- 上面便是zookeeper原生的API中,对节点的CRUD操作,原生的API,对节点的增加还有删除都不能实现递归操作,操作起来确实有点麻烦,但是为了了解原生API的知识,不得不去总结一下。