美文网首页
Zookeeper Java 客户端API的使用(三)

Zookeeper Java 客户端API的使用(三)

作者: 5d44bc28b93d | 来源:发表于2017-10-24 00:19 被阅读126次

    zookeeper java api使用简介

    1.建立连接


    CONNECT_HOST 服务器地址及端口 例如127.0.0.1:2181
    TIMEOUT 超时时间
    new JavaApiClient() watch 必须实现Watch接口

      zk = new ZooKeeper(CONNECT_HOST, TIMEOUT, new JavaApiClient());
    

    2.获取数据


    2.1 同步获取数据

    • param 1:节点名称
    • param 2:是否需要监听 true 默认的监听器
    • param 3: stat节点状态信息,调用完成后能从此状态信息获取节点状态
      /**
         * 同步获取节点数据
         *
         * @return 节点数据
         */
        private byte[] getDataSync() {
            byte[] resdata = null;
            try {
                resdata = zk.getData("/worke_1", false, new Stat());
            } catch (KeeperException e) {
                e.printStackTrace();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return resdata;
        }
    

    2.2 异步获取节点数据

    getDataASync:

    • param 1:节点名称
    • param 2:是否监听
    • param 3:回调类 异步成功后会调用该类的processResult方法

    processResult:

    • @param i i<0获取失败 i=0 获取成功
    • @param s 节点名称
    • @param o 传入的上下文
    • @param bytes 节点数据
    • @param stat 状态对象
      /**
         * 异步获取
         */
        private void getDataASync() {
            zk.getData("/worke_1", false, new GetDataCallBack(), null);
        }
        class GetDataCallBack implements AsyncCallback.DataCallback {
    
            public void processResult(int i, String s, Object o, byte[] bytes, Stat stat) {
    
            }
        }
    

    3. 创建节点


    3.1 同步创建节点

    create方法:

    • param 1:节点名称
    • param 2:节点存储数据
    • param 3:acl权限
    • param 4:节点类型 此处为临时节点
     /**
         * 同步创建节点
         *
         * @return 节点路径
         */
        private String createNodeSync() {
            String path = null;
            try {
                path = zk.create("/worke_1", "123".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
            } catch (KeeperException e) {
                e.printStackTrace();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return path;
        }
    

    3.2 异步创建节点

    方法create:

    • param 1.节点名称
    • param 2.数据data
    • param 3.权限acl
    • param 4.节点类型
    • param 5.回调类
    • param 6.上下文
    /**
         * 异步创建节点
         */
        private void createANodeASync() {
            zk.create("/worke_1", "123".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL, new CreateStringCallBack(), "创建");
        }
    /**
         * 异步创建调用类
         */
    
        class CreateStringCallBack implements AsyncCallback.StringCallback {
            /**
             * @param i  i<0创建失败 i=0 创建成功
             * @param s  节点名称
             * @param o  传入的上下文
             * @param s1 节点名称
             */
            public void processResult(int i, String s, Object o, String s1) {
    
               
            }
        }
    

    4. 获取子节点列表


    4.1 同步获取

    getChildren:

    • param 1:节点名
    • param 2:是否监听
     /**
         * 获取node节点
         *
         * @return
         */
        private List<String> listNodeSync() {
            List<String> childrens = null;
            try {
                childrens = zk.getChildren("/", false);
            } catch (KeeperException e) {
                e.printStackTrace();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return childrens;
        }
    

    4.2 异步获取

    getChildren:

    • param 1:节点名称
    • param 2:是否监听
    • param 3:回调类
    • param 4:上下文
        private void listNodeAsync() {
                zk.getChildren("/", false, new GetCallBack(), "async get");
    
            }
     /**
         * 异步获取调用类
         */
        class GetCallBack implements AsyncCallback.ChildrenCallback {
            /**
             *
             * @param i i<0 获取失败 i=0成功
             * @param s s 节点
             * @param o o 上下文信息
             * @param list 子节点列表
             */
            public void processResult(int i, String s, Object o, List<String> list) {
                System.out.println("getcallback");
    
                System.out.println(list);
    
            }
        }
    

    5.判断节点是否存在


    方法exists

    • param 1: 节点名称
    • param 2:是否监听
    • return : 状态信息
     /**
         * 同步判断是否存在节点
         */
        private boolean existNodeSync() {
            boolean flag = false;
            try {
                System.out.println("判断是否存在");
                Stat stat = zk.exists("/worke_1", false);
                if (stat != null) {
                    flag = true;
                }
                System.out.println(stat);
            } catch (KeeperException e) {
                e.printStackTrace();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return flag;
        }
    

    6. 删除节点


    6.1 同步删除节点

    delete:

    • param 1:节点路径
    • param 2:是否递归删除子节点信息
      /**
         * 同步删除节点
         *
         * @param path
         * @param version version参数指定要更新的数据的版本, 如果version和真实的版本不同, 删除操作将失败. 指定version为-1则忽略版本检查.
         */
    
        private void deleteNodeSync(String path, int version) {
            try {
                zk.delete(path, -1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (KeeperException e) {
                e.printStackTrace();
            }
        }
    

    6.2 异步删除

    delete:

    • param 1: 节点名
    • param 2: version
    • param 3: 删除回调类
    • param 4: 上下文信息
    /**
         * 异步删除节点
         *
         * @param path
         * @param version version参数指定要更新的数据的版本, 如果version和真实的版本不同, 删除操作将失败. 指定version为-1则忽略版本检查.
         */
        private void deleteNodeASync(String path, int version) {
    
            zk.delete(path, -1, new DelCallBack(), "删除");
    
        }
         /**
         * 删除回调
         */
        class DelCallBack implements AsyncCallback.VoidCallback {
            /**
             *
             * @param i i<0 删除失败 i=0 删除成功
             * @param s s 节点
             * @param o o 上下文信息
             */
            public void processResult(int i, String s, Object o) {
    
            }
        }
    
    
    

    7. 权限设置


    权限模式(scheme):ip,digest
    授权对象:
    ip模式:具体的ip
    digest模式: username:Base64(SHA-1(username:password))

     private void createANodeASync() throws NoSuchAlgorithmException {
           //ip权限
           ACL aclIP = new ACL(ZooDefs.Perms.ADMIN, new Id("ip", "192.168.1.111"));
           //用户名密码的复合权限
           ACL aclDigest = new ACL(ZooDefs.Perms.CREATE | ZooDefs.Perms.DELETE, new Id("digest", DigestAuthenticationProvider.generateDigest("test:test")))
           ArrayList<ACL> aclList =new ArrayList<>();
           aclList.add(aclIP);
           aclList.add(aclDigest);
           zk.create("/worke_1", "123".getBytes(), aclList, CreateMode.EPHEMERAL, new CreateStringCallBack(), "创建");
       }
    
    

    8. 监听事件


    1.实现Watcher接口,实现process方法

     public void process(WatchedEvent watchedEvent) {
            if (watchedEvent.getState() == Event.KeeperState.SyncConnected) {
                
            }
        }
    

    总结


    • 一次性监控:从原生的API中我们可以看出,由于Watch事件具有one-time trigger(一次性触发)的特性,所以我们每次操控节点时(增删改)都要提前注册监控,这是原生API的缺陷。

    • 不返回数据:当我们对节点(增删改)操作完成之后,需要我们自己封装方法去读取更改后的内容,原生的API并不提供,这有点不符合我们的编程习惯。

    • 不提供递归创建和递归删除:原生的API不提供递归创建节点和递归删除节点,也就是说,当我们创建子节点时,父节点必须存在,当我们删除节点时,该节点必须是子节点,若其父节点存在,会throw Exception。

    相关文章

      网友评论

          本文标题:Zookeeper Java 客户端API的使用(三)

          本文链接:https://www.haomeiwen.com/subject/piwzuxtx.html