zoukankan      html  css  js  c++  java
  • 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();
            }
        }
    }
  • 相关阅读:
    ubuntu 安装(install) pwntcha[一个做"验证码识别"的开源程序]
    MySQL 二进制日志过滤
    MySQL 分区表各个分区的行数
    MySQL 表分区A
    MySQL show binglog event in 'log_name'
    MySQL、You are using safe update mode
    SQL 设计心得、逗号分隔列表
    MYSQL @、@@、@x
    SQL Server
    建设供内网访问的网站
  • 原文地址:https://www.cnblogs.com/jkin/p/14791465.html
Copyright © 2011-2022 走看看