package com.sandul.zookeeper01;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.framework.recipes.cache.*;
import org.apache.curator.retry.ExponentialBackoffRetry;
import org.apache.zookeeper.CreateMode;
import org.junit.Test;
/**
* @description:
* @author: Sandul
* @create: 2021-05-06 14:19
**/
public class Demo01Test {
@Test
public void test01() throws Exception{
ExponentialBackoffRetry retry = new ExponentialBackoffRetry(1000, 3, 10);
final CuratorFramework client = CuratorFrameworkFactory.newClient("127.0.0.1", 3000, 1000, retry);
client.start();
System.out.println("连接成功。。。。。。");
//1,创建一个空节点
// client.create().forPath("/a");
//2,创建一个有内容的b节点
// client.create().forPath("/b","this is b".getBytes());
//3,创建多层节点
//creatingParentsIfNeeded() 是否需要递归创建节点
// withMode(CreateMode.PERSISTENT) 创建持久性节点
// client.create().creatingParentsIfNeeded().withMode(CreateMode.PERSISTENT).forPath("/d/d1","this is c".getBytes());
//4.创建带有序号的节点
// client.create().creatingParentsIfNeeded().withMode(CreateMode.PERSISTENT_SEQUENTIAL).forPath("/e","this is e".getBytes());
//5.创建临时节点(客户端关闭,节点消失),设置延时5秒关闭
// client.create().creatingParentsIfNeeded().withMode(CreateMode.EPHEMERAL).forPath("/g","this is f".getBytes());
//6.创建临时带序号的节点(客户端关闭,节点消失)
// client.create().creatingParentsIfNeeded().withMode(CreateMode.EPHEMERAL_SEQUENTIAL).forPath("/f","this is f".getBytes());
//7.修改节点数据
// client.setData().forPath("/a","this is changed data for a".getBytes());
//8.查询节点数据
// byte[] bytes = client.getData().forPath("/a");
// System.out.println(new String(bytes));
//9.删除一个节点(只能是没有子节点的节点)
// client.delete().forPath("/c");
//10.删除节点并递归删除其子节点
// client.delete().deletingChildrenIfNeeded().forPath("/d");
//11.强制保证删除一个节点,在客户端存活期间一直尝试删除,直到节点删除成功。
// client.delete().guaranteed().deletingChildrenIfNeeded().forPath("/e0000000008");
//12.创建节点数据监听对象
/**NodeCache监听节点变化*/
final NodeCache nodeCache = new NodeCache(client, "/a");
//开始缓存
nodeCache.start(true);
//nodeCache.start(true);参数为true时才能获取到监听节点数据
System.out.println(nodeCache.getCurrentData());
//添加监听对象
nodeCache.getListenable().addListener(new NodeCacheListener() {
//如果节点数据有变化,会回调该方法
public void nodeChanged() throws Exception {
String data = new String(nodeCache.getCurrentData().getData());
System.out.println("数据Watcher:path="+nodeCache.getCurrentData().getPath()+" :data="+data);
}
});
/**监听指定节点的子节点的变化*/
/**
* NORMAL: 普通启动方式, 在启动时缓存子节点数据
* POST_INITIALIZED_EVENT:在启动时缓存子节点数据,提示初始化
* BUILD_INITIAL_CACHE: 在启动时什么都不会输出
* 在官方解释中说是因为这种模式会在start执行执行之前先执行rebuild的方法,而rebuild的方法不会发出任何事件通知。
*/
PathChildrenCache childrenCache = new PathChildrenCache(client, "/a", true);
childrenCache.start(PathChildrenCache.StartMode.POST_INITIALIZED_EVENT);
//添加监听
childrenCache.getListenable().addListener(new PathChildrenCacheListener() {
public void childEvent(CuratorFramework curatorFramework, PathChildrenCacheEvent pathChildrenCacheEvent) throws Exception {
if (pathChildrenCacheEvent.getType()==PathChildrenCacheEvent.Type.CHILD_UPDATED){
System.out.println("子节点更新。。。");
System.out.println("节点:"+pathChildrenCacheEvent.getData().getPath()+" 数据:"+(new String(pathChildrenCacheEvent.getData().getData())));
}else if (pathChildrenCacheEvent.getType()==PathChildrenCacheEvent.Type.CHILD_ADDED){
System.out.println("子节点添加。。。");
System.out.println("节点:"+pathChildrenCacheEvent.getData().getPath()+" 数据:"+(new String(pathChildrenCacheEvent.getData().getData())));
}else if (pathChildrenCacheEvent.getType()==PathChildrenCacheEvent.Type.CHILD_REMOVED){
System.out.println("子节点删除。。。");
System.out.println("节点:"+pathChildrenCacheEvent.getData().getPath()+" 数据:"+(new String(pathChildrenCacheEvent.getData().getData())));
}else if (pathChildrenCacheEvent.getType()==PathChildrenCacheEvent.Type.INITIALIZED){
System.out.println("初始化。。。");
}else if (pathChildrenCacheEvent.getType()==PathChildrenCacheEvent.Type.CONNECTION_RECONNECTED){
System.out.println("重新连接。。。");
}else if (pathChildrenCacheEvent.getType()==PathChildrenCacheEvent.Type.CONNECTION_SUSPENDED){
System.out.println("连接失效。。。");
}else if (pathChildrenCacheEvent.getType()==PathChildrenCacheEvent.Type.CONNECTION_LOST){
System.out.println("连接失效后稍等一会儿执行。。。");
}
}
});
TreeCache treeCache = new TreeCache(client, "/a");
treeCache.start();
System.out.println(treeCache.getCurrentData("/a"));
treeCache.getListenable().addListener(new TreeCacheListener() {
public void childEvent(CuratorFramework curator, TreeCacheEvent event) throws Exception {
if (event.getType()==TreeCacheEvent.Type.NODE_ADDED){
System.out.println("节点添加:"+event.getData().getPath()+" data:"+(new String(event.getData().getData())));
}else if (event.getType()==TreeCacheEvent.Type.NODE_UPDATED){
System.out.println("节点更新:"+event.getData().getPath()+" data:"+(new String(event.getData().getData())));
}else if (event.getType()==TreeCacheEvent.Type.NODE_REMOVED){
System.out.println("节点移除:"+event.getData().getPath()+" data:"+(new String(event.getData().getData())));
}else if (event.getType()==TreeCacheEvent.Type.INITIALIZED){
System.out.println("初始化完成");
}else if (event.getType()==TreeCacheEvent.Type.CONNECTION_SUSPENDED){
System.out.println("连接过时");
}else if (event.getType()==TreeCacheEvent.Type.CONNECTION_RECONNECTED){
System.out.println("重新连接");
}else if (event.getType()==TreeCacheEvent.Type.CONNECTION_LOST){
System.out.println("连接过时一段时间了稍后再试");
}
}
});
Thread.sleep(100000);
nodeCache.close();
childrenCache.close();
treeCache.close();
client.close();
}
}
javaAPI操作zookeeper
最新推荐文章于 2024-04-18 03:00:30 发布