《ZooKeeper》---原生的API中的增删改查操作

来源:互联网 发布:知乎怎么回答问题 编辑:程序博客网 时间:2024/06/05 14:21

前言

  • 上一篇文章中,小编简单的介绍了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;//ms /** 信号量,阻塞程序执行,用于等待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();        //如果是建立连接(SyncConnected表示连接成功的状态)        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);//rc 为服务响应码 0 代表调用成功,-4代表端口连接,-110表示指定节点存在,-112表示会话已经过期        System.out.println(path);//path 接口调用时传入API的数据节点的路径参数        System.out.println(ctx);// 调用接口传入API ctx的值  再此 ctx的值为 “这是回调函数中传入的参数”     }}, "这是回调函数中传入的参数");

小结

  • 上面便是zookeeper原生的API中,对节点的CRUD操作,原生的API,对节点的增加还有删除都不能实现递归操作,操作起来确实有点麻烦,但是为了了解原生API的知识,不得不去总结一下。
1 0