ZKClient介绍
ZKClient是Github上一个开源的ZooKeeper客户端,是由Datameer的工程师Stefan Groschupf和Peter Voss一起开发的。ZKClient是在原生的ZooKeeper接口上做了一次包装,使得一些方法对于开发人员透明,方法更加易用。
ZKClient的maven依赖
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
建立会话连接
跟原生的ZooKeeper接口方法相比,ZKClient的方法更加易用,ZKClient将ZooKeeper的异步调用,封装成了同步调用,将原来的异步对开发人员透明化,这样开发人员不在需要写一些相关的异步阻塞唤醒之类的代码。两者的最大区别在于在连接的构造方法中不在需要提供传入的Watcher对象参数,ZKClient从内部为我们引入了Listener来实现Watcher的注册。
package zkclient;
import org.I0Itec.zkclient.ZkClient;
public class CreateSession {
public static void main(String[] args) {
ZkClient client = new ZkClient("192.168.28.124:2181",5000);
System.out.println("zookeeper connection is established!");
}
}
创建节点
看一下ZKClient提供的创建节点的方法:
跟ZooKeeper一样,同样提供了创建节点的方法,但是不同的是,它自己也提供了自己的实现方式,创建节点的类型在ZooKeeper中是通过枚举类CreateMode来区分不同的节点类型,ZKClient则自己提供了相关的实现。值得关注的是在ZooKeeper中是不支持递归创建节点的,也就是不能够同时创建父节点和子节点。在ZKClient中提供了参数createParents布尔值参数来表示是否要创建父节点。
package zkclient;
import org.I0Itec.zkclient.ZkClient;
public class ZKClientCreateZNode {
public static void main(String[] args) {
ZkClient client = new ZkClient("192.168.28.124:2181",5000);
System.out.println("zookeeper connection is established!");
client.createPersistent("/zkclient/zksubclient",true);
}
}
查看客户端是否创建了该节点
[zk: localhost:2181(CONNECTED) 1] ls /
[zkclient, zookeeper, sequenceNode0000000002, athird_node, forth_node0000000006, jiang, aforth_node0000000011]
[zk: localhost:2181(CONNECTED) 2] ls /zkclient
[zksubclient]
删除节点
在原生的API中不提供逐层删除的功能,如果当前节点存在子节点,那么这个节点是不可能被删除的,只有先删除子节点,再删除父节点。而在ZKClient中提供了deleteRecursive方法来进行逐层删除。
提供方法如下:
package zkclient;
import org.I0Itec.zkclient.ZkClient;
public class ZKClientDeleteZKNode {
public static void main(String[] args) {
ZkClient client = new ZkClient("192.168.28.124:2181",5000);
System.out.println("zookeeper connection is established!");
client.deleteRecursive("/zkclient");
}
}
获取节点
在获取节点的方法上同样是使用getChildren的方法,但是在ZKClient中没有提供一个warcher参数来监听服务店该节点在的子节点的变化通知。如果想要获得对节点上子节点的变化通知,需要使用subscribeChildChanges方法,通过该API的调用,就完成了事件的监听注册。对于节点的新增,减少,删除父节点该方法都会收到服务器的通知。
package zkclient;
import java.util.List;
import org.I0Itec.zkclient.IZkChildListener;
import org.I0Itec.zkclient.ZkClient;
public class ZKClientGetZNode {
public static void main(String[] args) throws InterruptedException {
ZkClient client = new ZkClient("192.168.28.124:2181",5000);
System.out.println("zookeeper connection is established!");
client.subscribeChildChanges("/zkclient", new IZkChildListener() {
@Override
public void handleChildChange(String parentPath, List<String> currentChilds) throws Exception {
// TODO Auto-generated method stub
System.out.println(parentPath + "'s child changed,current children are : " + currentChilds);
}
});
client.createPersistent("/zkclient/zksubclient",true);
Thread.sleep(2000);
client.createPersistent("/zkclient/zksubclient1");
Thread.sleep(2000);
client.createPersistent("/zkclient/zksubclient2");
Thread.sleep(2000);
}
}
执行效果如下
zookeeper connection is established!
/zkclient's child changed,current children are : [zksubclient]
/zkclient's child changed,current children are : [zksubclient1, zksubclient]
/zkclient's child changed,current children are : [zksubclient2, zksubclient1, zksubclient]