import java.util.List;

import org.I0Itec.zkclient.IZkChildListener;
import org.I0Itec.zkclient.ZkClient;

/**
 * 
* @ClassName: Get_Children_Sample 
* @Description: TODO(ZkClient获取子节点列表) 
* @author
* @date 2017年6月14日 下午1:01:45 
*
 */
public class Get_Children_Sample {

    public static void main(String[] args) throws Exception {

    	String path = "/zk-book";
        ZkClient zkClient = new ZkClient("localhost:2181", 5000);
        zkClient.subscribeChildChanges(path, new IZkChildListener() {
            public void handleChildChange(String parentPath, List<String> currentChilds) throws Exception {
                System.out.println(parentPath + " 's child changed, currentChilds:" + currentChilds);
            }
        });
        
        zkClient.createPersistent(path);
        Thread.sleep( 1000 );
        System.out.println(zkClient.getChildren(path));
        Thread.sleep( 1000 );
        zkClient.createPersistent(path+"/c1");
        Thread.sleep( 1000 );
        zkClient.delete(path+"/c1");
        Thread.sleep( 1000 );
        zkClient.delete(path);
        Thread.sleep( Integer.MAX_VALUE );
    }
}

输出:
/zk-book 's child changed, currentChilds:[]
[]
/zk-book 's child changed, currentChilds:[c1]
/zk-book 's child changed, currentChilds:[]
/zk-book 's child changed, currentChilds:null


注意:

客户端可以对一个不存在的节点进行子节点变更监听。

一旦客户端对一个节点注册了子节点变更监听之后,那么当该节点的子节点列表发生变更的时候,服务端都会通知客户端,并将最新的子节点列表发送给客户端。

该节点本身的创建和删除也会通知客户端。

ZkClient的Listener不是一次性的,客户端只需要注册一次就会一直生效。

ZkClient只提供了一个对外的API,用于获取指定的子节点列表,这个API的返回值是子节点的相对路径。客户端可以对一个不存在的节点进行子节点变更监听。

一旦客户端对一个节点注册了子节点列表变更监听之后,那么当该节点的子节点列表发生变更的时候,服务端都会通知客户端,并将最新的子节点列表发送给客户端。

该节点本身的创建或删除也会通知到客户端。Zookeeper的Listener不是一次性的,客户端只需要注册一次就一直有效。

ZkClient中引入了Listener的概念,客户端可以通过注册相关的事件监听来对Zookeeper服务端事件订阅,在获取直接点列表的接口上,可以通过如下API来进行监听和取消监听:



扩展



参考

1.《从Paxos到Zookeeper:分布式一致性原理与实践》

2.  http://javadox.com/com.101tec/zkclient/0.4/org/I0Itec/zkclient/ZkClient.html


Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐