zookeeper javaAPI

zookeeper javaAPI

znode是zooKeeper集合的核心组件,zookeeper API提供了一小组方法使用zookeeper集合来操纵znode的所有细节。
客户端应该遵循以步骤,与zookeeper服务器进行清晰和干净的交互。
  • 连接到zookeeper服务器。zookeeper服务器为客户端分配会话ID。
  • 定期向服务器发送心跳。否则,zookeeper服务器将过期会话ID,客户端需要重新连接。
  • 只要会话ID处于活动状态,就可以获取/设置znode。
  • 所有任务完成后,断开与zookeeper服务器的连接。如果客户端长时间不活动,则 zookeeper服务器将自动断开客户端。
ZooKeeper常用方法
1、连接到zookeeper
ZooKeeper(String connectionString, int sessionTimeout, Watcher watcher)
  • connectionString - zookeeper主机
  • sessionTimeout - 会话超时(以毫秒为单位)
  • watcher - 实现“监视器”对象。zookeeper集合通过监视器对象返回连接状态。

2、新增节点

 // 同步方式
create(String path, byte[] data, List<ACL> acl, CreateMode createMode) // 异步方式
create(String path, byte[] data, List<ACL> acl, CreateMode createMode, AsyncCallback.StringCallback callBack,Object ctx)
  • path - znode路径。例如,/node1 /node1/node11
  • data - 要存储在指定znode路径中的数据
  • acl - 要创建的节点的访问控制列表。zookeeper API提供了一个静态接口 ZooDefs.Ids 来获取一些基本的acl列表。例如,ZooDefs.Ids.OPEN_ACL_UNSAFE 返回打开znode的acl列表。
  • createMode - 节点的类型,这是一个枚举。
  • callBack-异步回调接口
  • ctx-传递上下文参数

3、更新节点

// 同步方式
setData(String path, byte[] data, int version)
// 异步方式
setData(String path, byte[] data, int version,AsyncCallback.StatCallback callBack, Object ctx)
  • path- znode路径
  • data - 要存储在指定znode路径中的数据。
  • version- znode的当前版本。每当数据更改时,ZooKeeper会更新znode的版本 号。
  • callBack-异步回调接口
  • ctx-传递上下文参数

4、删除节点

 // 同步方式
delete(String path, int version)
// 异步方式
delete(String path, int version, AsyncCallback.VoidCallback callBack, Object ctx)
  • path - znode路径。
  • version - znode的当前版本
  • callBack-异步回调接口
  • ctx-传递上下文参数

5、查看节点

// 同步方式
getData(String path, boolean b, Stat stat)
// 异步方式
getData(String path, boolean b,AsyncCallback.DataCallback callBack, Object ctx)
  • path - znode路径。
  • b- 是否使用连接对象中注册的监视器。
  • stat - 返回znode的元数据。
  • callBack-异步回调接口 ctx-传递上下文参数

6、查看子节点

 // 同步方式
getChildren(String path, boolean b)
// 异步方式
getChildren(String path, boolean b,AsyncCallback.ChildrenCallback callBack,Object ctx)
  • path - Znode路径。
  • b- 是否使用连接对象中注册的监视器。
  • callBack - 异步回调接口。
  • ctx-传递上下文参数

7、检查节点是否存在

 // 同步方法
exists(String path, boolean b)
// 异步方法
exists(String path, boolean b,AsyncCallback.StatCallback callBack,Object ctx)
  • path- znode路径。
  • b- 是否使用连接对象中注册的监视器。
  • callBack - 异步回调接口。
  • ctx-传递上下文参数

综合案列

使用 zookeeper 原生 API,连接需要时间,用 countDownLatch 阻塞,等待连接成功,控制台输出连接状态!

package com.wfj.zookeeper;

import org.apache.zookeeper.*;
import org.apache.zookeeper.data.Stat;

import java.util.List;
import java.util.concurrent.CountDownLatch;

public class ZookeeperAPI {
    public static void main(String[] args) {
        try {
            // 计数器对象
            CountDownLatch countDownLatch = new CountDownLatch(1);
            // arg1:服务器的ip和端口
            // arg2:客户端与服务器之间的会话超时时间  以毫秒为单位的
            // arg3:监视器对象
            ZooKeeper zooKeeper = new ZooKeeper("127.0.0.1:2181", 5000, new Watcher() {
                @Override
                public void process(WatchedEvent event) {
                    if (event.getState() == Event.KeeperState.SyncConnected) {
                        System.out.println("连接创建成功!");
                        countDownLatch.countDown();
                    }
                }
            });
            // 主线程阻塞等待连接对象的创建成功
            countDownLatch.await();
            // 会话编号
            System.out.println(zooKeeper.getSessionId());

            //判断节点是否存在 arg1:节点的路径
            Stat stat=zooKeeper.exists("/wfj/node3",false);
            // 返回null,说明节点不存在
            System.out.println("输出为null,证明节点不存在" + stat);

            // 创建节点 arg1:节点的路径 arg2:节点的数据 arg3:权限列表  world:anyone:cdrwa arg4:节点类型  持久化节点
            zooKeeper.create("/wfj/node3","node3".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);

            // 获取节点的值 arg1:节点的路 arg3:读取节点属性的对象
            Stat stat_get=new Stat();
            byte [] bys=zooKeeper.getData("/wfj/node3",false,stat_get);
            // 打印数据和版本信息
            System.out.println(new String(bys));
            System.out.println(stat_get.getVersion());

            // 修改节点的值 arg1:节点的路径 arg2:修改的数据 arg3:数据版本号 -1代表版本号不参与更新
            Stat stat_set = zooKeeper.setData("/wfj/node1", "node13".getBytes(), -1);
            System.out.println(stat_set.getVersion());

            // 获取子节点 arg1:节点的路径
            List<String> list = zooKeeper.getChildren("/wfj", false);
            for (String str : list) {
                System.out.println(str);
            }

            // 删除节点 arg1:删除节点的节点路径 arg2:数据版本信息 -1代表删除节点时不考虑版本信息
            zooKeeper.delete("/wfj/node3",-1);
            
            zooKeeper.close();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}
原文地址:https://www.cnblogs.com/jkin/p/14791465.html