Zookeeper-3-客户端操作

Zookeeper-3-客户端操作

1、常用命令操作

【1】查看路径下的节点

ls /路径,只查看节点信息

ls2 /路径,附带节点的状态信息

【2】获取节点数据

get /路径

【3】查看节点状态

stat /路径

【4】创建节点

create /路径 数据,创建持久节点

create -s /路径 数据,创建持久有序节点

create -e /路径 数据,创建临时节点

create -s -e /路径 数据,创建临时有序节点

 顺序序号从当前路径下的节点个数开始,默认为0000000000

 有序节点的名称为创建时的路径名称 + 顺序序号

【5】更新节点数据

set /路径 数据

扫描二维码关注公众号,回复: 12279592 查看本文章

【6】删除节点

delete /路径,删除子节点(没有子目录)

rmr /路径,删除当前节点及其子节点(存在子目录)

【7】监听路径下的节点变化

ls /路径 watch

 节点发生改变:

WATCHER::

WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/???

 注意监听事件一旦触发,该监听器就会失效,如果还需要监听,则仍需创建监听器

【8】监听节点下的数据变化

get /路径 watch

 数据发生改变:

WATCHER::

WatchedEvent state:SyncConnected type:NodeDataChanged path:/???

 注意监听事件一旦触发,该监听器就会失效,如果还需要监听,则仍需创建监听器

2、Java操作

【0】Maven依赖

<dependency>
    <groupId>org.apache.zookeeper</groupId>
    <artifactId>zookeeper</artifactId>
    <version>3.4.14</version>
</dependency>

【1】创建客户端

private static final String connectString = "???.???.???.???:2181,???.???.???.???:2181,???.???.???.???:2181";
private static final int sessionTimeout = 1000 * 60 * 5; // 会话时长(5分钟)

public static void main(String[] args) {
    
    
    Watcher watcher = new Watcher() {
    
    
        @Override
        public void process(WatchedEvent event) {
    
    
            System.out.println(event.toString());
        }
    };

    ZooKeeper zooKeeper = null;
    try {
    
    
        zooKeeper = new ZooKeeper(connectString, sessionTimeout, watcher);

        ZooKeeper.States state = zooKeeper.getState();
        System.out.println(state); // CONNECTING
    } catch (IOException e) {
    
    
        e.printStackTrace();
    } finally {
    
    
        if (null != zooKeeper) {
    
    
            try {
    
    
                zooKeeper.close();
            } catch (InterruptedException e) {
    
    
                e.printStackTrace();
            }
        }
    }

}

【2】创建节点

/*
 * data:byte数组允许的最大值为 1 MB (1,048,576 bytes)
 * acl:访问权限,接口常量 --> org.apache.zookeeper.ZooDefs.Ids
 * createMode:节点类型,枚举类 --> org.apache.zookeeper.CreateMode
 */
String znode = zooKeeper.create("/???", "???".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); // 没有访问限制的持久性节点
System.out.println(znode); // 返回节点路径

【3】查看节点

// watch:是否开启监听,如果为true,则使用创建 ZooKeeper 时,所创建的 Watcher
List<String> children = zooKeeper.getChildren("/???", false);
children.forEach(System.out::println);


CountDownLatch cd = new CountDownLatch(1);
List<String> children = zooKeeper.getChildren("/???", new Watcher() {
    
     // 使用指定的 Watcher
    @Override
    public void process(WatchedEvent event) {
    
    
        System.out.println(event.getPath() + "\t" + event.getType());
        cd.countDown();
    }
});
children.forEach(System.out::println);
cd.await();

【4】判断节点是否存在

Stat exists = zooKeeper.exists("/???", false);
if (null != exists) {
    
    
    System.out.println(listStatMessage(exists));
} else {
    
    
    System.out.println("节点不存在!");
}

【5】获取节点数据

byte[] data = zooKeeper.getData("/???", false, null); // 仅获取数据
String val = new String(data, StandardCharsets.UTF_8);
System.out.println(val);


Stat stat = new Stat();
byte[] data = zooKeeper.getData("/???", false, stat); // 获取数据的同时还要查看节点状态
String val = new String(data, StandardCharsets.UTF_8);
System.out.println(val);
System.out.println(stat);

【6】查看节点状态

StringBuilder sBuilder = new StringBuilder();
// 创建该节点的事务id
sBuilder.append("cZxid = 0x").append(Long.toHexString(stat.getCzxid())).append("\r\n");
// 创建该节点的时间(从 midnight, January 1, 1970 UTC. 至今的毫秒数)
sBuilder.append("ctime = ").append(new Date(stat.getCtime())).append("\r\n");
// 最后修改该节点的事务id
sBuilder.append("mZxid = 0x").append(Long.toHexString(stat.getMzxid())).append("\r\n");
// 最后修改该节点的时间
sBuilder.append("mtime = ").append(new Date(stat.getMtime())).append("\r\n");
// 最后修改该节点的子节点的事务id
sBuilder.append("pZxid = 0x").append(Long.toHexString(stat.getPzxid())).append("\r\n");
// 更新该节点的子节点的次数
sBuilder.append("cversion = ").append(stat.getCversion()).append("\r\n");
// 更新该节点的数据的次数
sBuilder.append("dataVersion = ").append(stat.getVersion()).append("\r\n");
// 更新该节点的访问权限的次数
sBuilder.append("aclVersion = ").append(stat.getAversion()).append("\r\n");
// 当节点是一个临时节点时,该值是此节点所属的SessionId;如果节点不是临时节点,则该值是0
sBuilder.append("ephemeralOwner = 0x").append(Long.toHexString(stat.getEphemeralOwner())).append("\r\n");
// 该节点的数据的大小
sBuilder.append("dataLength = ").append(stat.getDataLength()).append("\r\n");
// 该节点的子节点的个数
sBuilder.append("numChildren = ").append(stat.getNumChildren());
System.out.println(sBuilder.toString());

【7】更新节点数据

/*
 * data:byte数组允许的最大值为 1 MB (1,048,576 bytes)
 * version:数据的版本号(dataVersion),如果版本号不正确,则抛出异常 -->
 *          org.apache.zookeeper.KeeperException$BadVersionException: KeeperErrorCode = BadVersion for /???
 */
Stat stat = zooKeeper.setData("/???", "???".getBytes(), ???);
System.out.println(stat);

【8】删除节点

/*
 * 如果存在子节点,则会抛出异常 -->
 * org.apache.zookeeper.KeeperException$NotEmptyException: KeeperErrorCode = Directory not empty for /???
 *
 * version:数据的版本号(dataVersion),如果版本号不正确,则抛出异常 -->
 *          org.apache.zookeeper.KeeperException$BadVersionException: KeeperErrorCode = BadVersion for /???
 */
zooKeeper.delete("/???", ???);
System.out.println("删除成功!");

【9】递归删除节点

public static void rmr(final ZooKeeper zooKeeper, final String path) throws KeeperException, InterruptedException {
    
    
    List<String> children = zooKeeper.getChildren(path, false);
    if (children.isEmpty()) {
    
    
        delete(zooKeeper, path);
        return;
    }
    for (int i = 0, size = children.size(); i < size; i++) {
    
    
        String childPath = path + "/" + children.get(i);
        rmr(zooKeeper, childPath);
    }
    delete(zooKeeper, path);
}

public static void delete(final ZooKeeper zooKeeper, final String path) throws KeeperException, InterruptedException {
    
    
    Stat stat = new Stat();
    zooKeeper.getData(path, false, stat);
    int version = stat.getVersion(); // 获取最新的数据版本号
    zooKeeper.delete(path, version);
    System.out.println("delete ==> " + path + " (" + version + ")");
}

猜你喜欢

转载自blog.csdn.net/adsl624153/article/details/100190127