zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    volatile关键字,使一个变量在多个线程间可见。
    grep sed awk
    mysql高级聚合
    Hive高级聚合GROUPING SETS,ROLLUP以及CUBE
    用SecureCRT来上传和下载文件
    mysql导出导入数据
    redis入门
    spark 常用技巧总结2
    生成数据库字典
    spark 常用技巧总结
  • 原文地址:https://www.cnblogs.com/luangeng/p/7398168.html
Copyright © 2011-2022 走看看