Zookeeper--Java API

Zookeeper--Java API及示例

zk客户端要连接zk服务器,首先需要创建org.apache.zookeeper.ZooKeeper的一个实例对象,然后调用该类的接口来和服务器交互。

主要接口如下:

String create(String path, byte[] data, List<ACL> acl, CreateMode createMode)

创建一个给定的目录节点path,并给它设置数据(所创建节点的父节点必须先存在),CreateMode标识有4种形式的目录节点,分别是:

PERSISTENT:持久化节点,节点储存的数据不会丢失

PERSISTENT_SEQUENTIAL:按顺序自动编号的持久化节点,根据已经存在的节点名自动加一,并返回该名称

EPHEMERAL:临时节点,一旦创建该节点的客户端与服务端session超时,该节点自动删除。

EPHEMERAL_SEQUENTAL:临时自动编号节点

Stat exists(String path, boolean watch)    Stat exists(String path, Watcher watcher)

判断某个path是否存在,并设置是否监控这个目录节点,这个watcher是在创建zk示例时指定的watcher。

重载方法可以指定特定的watcher

void delete(String path, int version)

删除path所对应的节点,version为-1时删除所有版本即删除节点的所有数据, 有子节点的节点需要先删除子节点,否则删除失败。

List<String> getChilden(String path, boolean watch)

获取path下所有的子节点,同样有一个指定watcher的重载方法

Stat setData(String path, byte[] data, int version)

给path设置数据,可以指定数据的版本号,如果version为-1则匹配所有版本

byte[] getData(String path, boolean watch, Stat stat)

获取这个path对应节点的数据,数据的版本可以通过stat来指定,watch为设置是否监控该节点的状态

void addAuthInfo(String scheme, byte[] auth)

客户端将自己的授权信息提交给服务器,服务器将根据授权信息检查客户端的访问权限

Stat setACL(String path, List<ACL> acl, int version)

给节点重新设置访问权限,zk中节点的权限不具有继承性。ACL由perms和Id组成,Perms由ALL, READ, WRITE, CREATE, DELETE, ADMIN几种。

ID标识了访问目录节点的身份列表,有ANYONE_ID_UNSAFE=new Id("world","anyone")  AUTH_IDS=new Id("auth","")

List<ACL> getACL(String path, Stat stat)

获取某个目录节点的访问权限列表

示例:

public class ZnodeTest {

    // 会话超时时间
    private static final int SESSION_TIMEOUT = 30000;

    // 创建 ZooKeeper 实例
    ZooKeeper zk;

    // 创建 Watcher 实例
    Watcher wh = new Watcher() {
        public void process(WatchedEvent event) {
            System.out.println("监控到:" + event.getType());
        }
    };

    // 初始化 ZooKeeper 实例
    private void createZKInstance() throws IOException {
        zk = new ZooKeeper("localhost", ZnodeTest.SESSION_TIMEOUT, this.wh);
    }

    private void ZKOperations() throws IOException, InterruptedException, KeeperException {
        List<String> level2 = zk.getChildren("/", false);
        for (String s : level2) {
            System.out.println("level2:" + s);
        }
        rDelete("/zoo");

        System.out.println("创建节点zoo");
        zk.create("/zoo", "zoo data".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);

        System.out.println("创建子节点keep");
        zk.create("/zoo/keep", "keep data".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT_SEQUENTIAL);
        zk.create("/zoo/keep", "keep data".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT_SEQUENTIAL);

        System.out.println("查看是否创建成功: " + new String(zk.getData("/zoo", false, null)));

        System.out.println("修改节点数据 ");
        zk.setData("/zoo", "zoo data update".getBytes(), -1);

        System.out.println("查看是否修改成功: " + new String(zk.getData("/zoo", false, null)));

        System.out.println("查看子节点");
        List<String> keeps = zk.getChildren("/zoo", false);
        for (String s : keeps) {
            System.out.println("keeps:" + s);
        }

        System.out.println("删除节点 ");
        rDelete("/zoo");

        System.out.println("查看节点是否被删除: " + zk.exists("/zoo", false));

    }

    private void rDelete(String path) throws KeeperException, InterruptedException {
        if (zk.exists(path, false) == null) {
            return;
        }
        List<String> ls = zk.getChildren(path, false);
        for (String s : ls) {
            rDelete(path + "/" + s);
        }
        zk.delete(path, -1);
    }

    private void rCreate(String path){

    }

    private void ZKClose() throws InterruptedException {
        zk.close();
    }


    public static void main(String[] args) throws IOException, InterruptedException, KeeperException {
        ZnodeTest dm = new ZnodeTest();
        dm.createZKInstance();
        dm.ZKOperations();
        dm.ZKClose();
    }

}

---

输出:

监控到:None
level2:zookeeper
创建节点zoo
创建子节点keep
查看是否创建成功: zoo data
修改节点数据
查看是否修改成功: zoo data update
查看子节点
keeps:keep0000000001
keeps:keep0000000000
删除节点
查看节点是否被删除: null

递归删除节点及其子节点:

private void rDelete(String path) throws KeeperException, InterruptedException {
        if (zk.exists(path, false) == null) {
            return;
        }
        List<String> ls = zk.getChildren(path, false);
        for (String s : ls) {
            rDelete(path + "/" + s);
        }
        zk.delete(path, -1);
    }

---

参考: 

http://zookeeper.apache.org/doc/r3.2.2/api/org/apache/zookeeper/ZooKeeper.html#create%28java.lang.String,%20byte%5B%5D,%20java.util.List,%20org.apache.zookeeper.CreateMode%29

原文地址:https://www.cnblogs.com/luangeng/p/7398168.html