javaAPI操作zookeeper

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();
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值