前言:
这是一款zookeeper 管理框架,实现了自动重连,安全验证,超时时间,链接重试,等方便管理的功能,本章只是实现CUrator的简单使用.
一:版本管理
注意: 这里只有一个依赖,如果出现错误,请查看是否依赖冲突,如果依赖冲突,请删除对应的依赖,5.0版本才有的一个监听器,如果版本不对 还未CuratorCache 这个监听器版本
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>5.0.0</version>
</dependency>
二:常规使用
代码解析:
一:
通过CuratorFrameworkFactor 创建client链接客户端的管理通道,并且使用建造者模式来简化代码,也就是builder方法,来设置对应的参数,比如connectString("127.0.0.1:2181") 这样子就是制定了zk的链接地址,或者说.retryPolicy传入对应的重试策略看起来也是很方便的,实际上用起来也是.
二:
getConnectionStateListenable 这个是状态监听器,当Curator 链接成功后的一个回调函数,正常情况下可以写链接成功后的业务逻辑,或者功能逻辑,剩下就很好理解了,按照字面意思来理解就没啥毛病
public static void main(String[] args) {
CuratorFramework client = CuratorFrameworkFactory.builder()
.connectString("127.0.0.1:2181")//链接地址
.retryPolicy(new RetryNTimes(1, 1000)) //重试次数
.connectionTimeoutMs(10000)//超时时间
.build();
client.getConnectionStateListenable().addListener(new ConnectionStateListener() {
@Override
public void stateChanged(CuratorFramework curatorFramework, ConnectionState connectionState) {
//curatorFramework 链接成功的客户端-或者说通道这样子
//connectionState 链接成功的状态
if (connectionState.isConnected()){
System.out.println("链接成功+---------------");
//链接成功 可以在这里写 回调函数
setListenterThreeThree(client,"watcher");
}
}
});
client.start();
try {
CreateMode nodeType = getNodeType(client, "/watcher/foreacg");
//判断节点是否存在,如果存在就是
if (nodeType==null){
client.create().creatingParentsIfNeeded().withMode(CreateMode.EPHEMERAL).forPath("/watcher/foreacg");
}
Thread.sleep(Integer.MAX_VALUE);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
二:监听器的使用
这里是CuratorCache 是5.0版本的特性,如果想使用这个特性,请使用大于5.0
CuratorCache: 可以理解为一个管理缓存监听器的东西, 可以通过builder 构建出监听器的集合,在这个集合也就是listenable 添加一个默认的Cache 监听器就可以监听到,该节点的数据变化,或者说可以理解,当该节点改变时,会通知该方法,回调你的业务逻辑
private static void setListenterThreeThree(CuratorFramework client,String path){
CuratorCache build = CuratorCache.builder(client, path).build();
Listenable<CuratorCacheListener> listenable = build.listenable();
listenable.addListener(new CuratorCacheListener() {
@Override
public void event(Type type, ChildData oldData, ChildData data) {
switch (type){
case NODE_CHANGED://节点包括子节点数据发生了改变
System.out.println("节点数据变化-也会监听的到"+new String(oldData.getData())+"-----------------"+new String( data.getData()));
break;
case NODE_CREATED://节点添加
System.out.println("添加了新的节点"+"-----------------"+data.getPath());
case NODE_DELETED:
System.out.println("删除了某个节点"+oldData.getPath());
break;
}
}
});
build.start();
}
三:创建节点
补全:上边缺失的方法
/**
* 判断节点是否是持久化节点
* @param client 客户端
* @param path 路径
* @return null-节点不存在 | CreateMode.PERSISTENT-是持久化 | CreateMode.EPHEMERAL-临时节点
*/
public static CreateMode getNodeType(CuratorFramework client,String path) {
Stat stat = null;
try {
stat = client.checkExists().forPath(path);
} catch (Exception e) {
e.printStackTrace();
}
if (stat == null) {
//不存在该节点
return null;
}
if (stat.getEphemeralOwner() > 0) {
//节点为不持久化节点
return CreateMode.EPHEMERAL;
}
//都不是就是持久化节点
return CreateMode.PERSISTENT;
}