Zookeeper客户端API之读取子节点列表(八)

本文涉及的产品
云原生网关 MSE Higress,422元/月
注册配置 MSE Nacos/ZooKeeper,118元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: Zookeeper客户端API之读取子节点列表(八)

本篇博客介绍一下Zookeeper原生客户端API提供的获取子节点列表方法。

获取子节点列表方法

方法

Zookeeper原生客户端API提供了以下8中获取子节点列表的方法,每个方法的使用说明参考注释内容:

/**
 * 返回指定路径下面的子节点列表。
 * 如果watcher不为null,并且调用成功(没有异常),会将watcher注册在指定的path
 * 上。当path(父节点)被删除或者path下面创建/删除子节点,将触发通知watcher。
 * 
 * 返回结果列表不保证有序性。
 */
public List<String> getChildren(final String path, Watcher watcher)
/**
 * 使用说明同上一个方法。
 */
public List<String> getChildren(String path, boolean watch)
/**
 * getChildren(String, Watcher)的异步版本
 */
public void getChildren(final String path, Watcher watcher,
            ChildrenCallback cb, Object ctx)
/**
 * getChildren(String, boolean)的异步版本
 */
public void getChildren(String path, boolean watch, ChildrenCallback cb,
            Object ctx)
/**
 * 为指定的路径返回stat和子节点列表。
 * 
 */
public List<String> getChildren(final String path, Watcher watcher,
            Stat stat)
/**
 * 使用说明同上一个方法。
 */
public List<String> getChildren(String path, boolean watch, Stat stat)
/**
 * getChildren(String, Watcher, Stat)的异步版本
 */
public void getChildren(final String path, Watcher watcher,
            Children2Callback cb, Object ctx)
/**
 * getChildren(String, boolean, Stat)的异步版本
 */
public void getChildren(String path, boolean watch, Children2Callback cb,
            Object ctx)

参数说明

参数名 说明

path 指定数据节点的路径,获取该节点下面的子节点

watcher 注册在path上的Watcher。path被删除或者path下面的创建/删除节点,向客户端发送通知。可为null

watch 表示是否需要注册一个watcher。true:注册默认watcher,false:不需要注册watcher

cb 注册一个异步的回调函数

ctx 用户传递信息

stat 指定数据节点状态信息。传入旧stat,方法执行过程中会将其替换为新stat对象。

具体案例


package com.secbro.learn;
import org.apache.zookeeper.*;
import java.util.List;
import java.util.concurrent.CountDownLatch;
/**
 * 获得子节点列表的方法
 * Created by zhuzs on 2017/3/26.
 */
public class TestGetChildrenMethod implements Watcher {
    private static CountDownLatch countDownLatch = new CountDownLatch(1);
    private static ZooKeeper zooKeeper;
    public static void main(String[] args) throws Exception {
        zooKeeper = new ZooKeeper("127.0.0.1:2181", 5000, new TestGetChildrenMethod());
        countDownLatch.await();
        // 创建父节点/test
        zooKeeper.create("/test", "123".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
        // 在父节点/test下面创建a1节点
        zooKeeper.create("/test/a1", "456".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
        // 同步获得结果
        List<String> childrenList = zooKeeper.getChildren("/test", true);
        System.out.println("同步getChildren获得数据结果:" + childrenList);
        // 异步获得结果
        zooKeeper.getChildren("/test",true,new MyChildren2Callback(),null);
        // 在父节点/test下面创建a2节点
        zooKeeper.create("/test/a2", "456".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
        Thread.sleep(10000);
    }
    public void process(WatchedEvent event) {
        if (Event.KeeperState.SyncConnected == event.getState()) {
            if(Event.EventType.None == event.getType() && null == event.getPath()){ // 连接时的监听事件
                countDownLatch.countDown();
            } else if (event.getType() == Event.EventType.NodeChildrenChanged){ // 子节点变更时的监听
                try {
                    System.out.println("重新获得Children,并注册监听:" + zooKeeper.getChildren(event.getPath(),true));
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
class MyChildren2Callback implements AsyncCallback.Children2Callback{
    public void processResult(int rc, String path, Object ctx, List<String> children, Stat stat) {
        System.out.println("异步获得getChildren结果,rc=" + rc
                + ";path=" + path + ";ctx=" + ctx + ";children=" + children +";stat=" + stat);
    }
}

输出结果:


同步getChildren获得数据结果:[a1]

异步获得getChildren结果,rc=0;path=/test;ctx=null;children=[a1];stat=14277,14277,1490498559704,1490498559704,0,1,0,0,3,1,14278


重新获得Children,并注册监听:[a1, a2]


上面的例子,先创建了一个父节点test,然后在其下面创建了a1子节点,并注册监听。当父节点test下面创建了新的a2子节点之后,监听事件触发。但此时需要重新主动获取该父节点下面的子节点,并继续注册监听事件。


上面只提供了新增子节点的案例,其实删除子节点或删除父节点同样会触发监听事件。


相关实践学习
基于MSE实现微服务的全链路灰度
通过本场景的实验操作,您将了解并实现在线业务的微服务全链路灰度能力。
目录
相关文章
|
23天前
|
搜索推荐 API 开发者
虾皮根据关键词取商品列表API接口的开发应用与收益
虾皮根据关键词取商品列表API接口的开发与应用为电商数据分析与应用提供了强大的支持。通过这一接口,开发者可以快速获取商品信息,实现精准营销、市场趋势分析、商品推荐等多种应用。同时,这一接口也为电商平台带来了提升用户体验、增加用户流量、提高运营效率等多重收益。随着电商行业的不断发展,虾皮的API接口将在未来发挥更加重要的作用,推动电商行业的数字化转型和智能化发展。
31 2
|
1月前
|
JSON API 数据格式
店铺所有商品列表接口json数据格式示例(API接口)
当然,以下是一个示例的JSON数据格式,用于表示一个店铺所有商品列表的API接口响应
|
2月前
|
分布式计算 Java Hadoop
Hadoop-30 ZooKeeper集群 JavaAPI 客户端 POM Java操作ZK 监听节点 监听数据变化 创建节点 删除节点
Hadoop-30 ZooKeeper集群 JavaAPI 客户端 POM Java操作ZK 监听节点 监听数据变化 创建节点 删除节点
72 1
|
2月前
|
API 数据安全/隐私保护 开发者
淘宝 API:关键词搜商品列表接口,助力商家按价格销量排序分析数据
此接口用于通过关键词搜索淘宝商品列表。首先需在淘宝开放平台注册并创建应用获取API权限,之后利用应用密钥和访问令牌调用接口。请求参数包括关键词、页码、每页数量、排序方式及价格区间等。返回结果含总商品数量及具体商品详情。使用时需注意签名验证及官方文档更新。
|
3月前
|
负载均衡 API 数据安全/隐私保护
Zookeeper的客户端-原生的API
Zookeeper的客户端-原生的API
|
4月前
|
API C# 开发框架
WPF与Web服务集成大揭秘:手把手教你调用RESTful API,客户端与服务器端优劣对比全解析!
【8月更文挑战第31天】在现代软件开发中,WPF 和 Web 服务各具特色。WPF 以其出色的界面展示能力受到欢迎,而 Web 服务则凭借跨平台和易维护性在互联网应用中占有一席之地。本文探讨了 WPF 如何通过 HttpClient 类调用 RESTful API,并展示了基于 ASP.NET Core 的 Web 服务如何实现同样的功能。通过对比分析,揭示了两者各自的优缺点:WPF 客户端直接处理数据,减轻服务器负担,但需处理网络异常;Web 服务则能利用服务器端功能如缓存和权限验证,但可能增加服务器负载。希望本文能帮助开发者根据具体需求选择合适的技术方案。
212 0
|
4月前
|
API
【Azure 应用服务】在App Service中调用外部服务API时需要携带客户端证书,而多次调用的情况下会出现WindowsCryptographicException Keyset does not exist异常
【Azure 应用服务】在App Service中调用外部服务API时需要携带客户端证书,而多次调用的情况下会出现WindowsCryptographicException Keyset does not exist异常
|
4月前
|
API 网络架构
【Azure 环境】用 PowerShell 调用 AAD Token, 以及调用Azure REST API(如资源组列表)
【Azure 环境】用 PowerShell 调用 AAD Token, 以及调用Azure REST API(如资源组列表)
|
3月前
|
安全 应用服务中间件 API
微服务分布式系统架构之zookeeper与dubbo-2
微服务分布式系统架构之zookeeper与dubbo-2
|
3月前
|
负载均衡 Java 应用服务中间件
微服务分布式系统架构之zookeeper与dubbor-1
微服务分布式系统架构之zookeeper与dubbor-1