Zookeeper Java API操作流程
首先需要配置一台Zookeeper服务器
pom文件
<dependencies>
<!-- https://mvnrepository.com/artifact/org.apache.zookeeper/zookeeper -->
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.6.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.curator/curator-framework -->
<!--Zookeeper客户端基础包-->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>4.0.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.curator/curator-recipes -->
<!--Zookeeper客户端曾强包-->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>4.0.1</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
实现节点的增删改查
/**
* 实现节点的增删改查
* 方式1:创建一个空永久节点(只能创建一个节点)
* 方式2:创建一个有内容永久的空节点(只能创建一层节点)
* 方式3:创建多层节点
* 是否需要创建父节点creatingParentsIfNeeded()
* 节点的创建模式 withMode(模式) 方法
* 参数CreateMode.PERSISTENT 创建持久性节点
* 参数CreateMode.PERSISTENT_SEQUENTIAL 创建带有序号的持久性节点
* 参数CreateMode.EPHEMERAL 创建临时性节点(客户端关闭,节点消失)
* 参数CreateMode.EPHEMERAL_SEQUENTIAL 创建带有序号的临时节点(客户端关闭,节点消失)
*/
public class zkDemo {
private CuratorFramework client = null;
/**
* 创建客户端
* 步骤:
* 1、创建连接失败重试策略对象
* 2、创建连接客户端
*/
@Before
public void createClient() {
//1.创建连接失败重试策略对象
//RetryPolIcy接口 失败重试策略的公共接口;ExponentialBackoffRetry实现类,是失败重试策略的接口实现类
//参数1:两次重试之间等待的初始化时间(单位毫秒)
//参数2:最大重试次数
RetryPolicy retryPolicy = new ExponentialBackoffRetry(3000, 3);
//2.创建客户端对象
//参数1:连接Zookeeper服务的IP地址和端口号
//参数2:会话超时时间(单位毫秒)
//参数3:连接超时时间(单位毫秒)
//参数4:失败重试策略对象
client = CuratorFrameworkFactory.newClient("节点的IP地址:2181", 1000, 1000, retryPolicy);
}
/**
* 创建节点(创建一个空节点)
* 1、开启客户端(会阻塞到会话连接成功为止)
* 2、创建节点
* 3、关闭客户端
*
* @throws Exception 异常行为
*/
@Test
public void createNode01() throws Exception {
//创建一个空节点
client.create().forPath("/app1");
}
/**
* 创建节点(创建一个有内容的空节点)
* 1、开启客户端(会阻塞到会话连接成功为止)
* 2、创建节点
* 3、关闭客户端
*
* @throws Exception 异常行为
*/
@Test
public void createNode02() throws Exception {
//创建一个有内容的空节点
client.create().forPath("/app2", "App2 Node".getBytes());
}
/**
* 创建节点(创建多层节点)
* 1、开启客户端(会阻塞到会话连接成功为止)
* 2、创建节点
* 3、关闭客户端
*
* @throws Exception 异常行为
*/
@Test
public void createNode03() throws Exception {
//创建多层节点
client.create().creatingParentsIfNeeded().forPath("/app4/data", "App4 Node".getBytes());
}
/**
* 创建节点(创建临时性节点)
* 1、开启客户端(会阻塞到会话连接成功为止)
* 2、创建节点
* 3、关闭客户端
*
* @throws Exception 异常行为
*/
@Test
public void createNode04() throws Exception {
//创建临时性节点
client.create().withMode(CreateMode.EPHEMERAL)
.forPath("/app5", "App5 Node".getBytes());
}
/**
* 创建节点(创建带序号的永久节点)
* 1、开启客户端(会阻塞到会话连接成功为止)
* 2、创建节点
* 3、关闭客户端
*
* @throws Exception 异常行为
*/
@Test
public void createNode05() throws Exception {
client.create().withMode(CreateMode.CONTAINER)
.forPath("/app6", "App6 Node".getBytes());
}
/**
* 修改节点数据
* 步骤:
* 1、启动客户端
* 2、修改节点
* 3、关闭客户端
*/
@Test
public void modifyNode() throws Exception {
//启动客户端
client.start();
//修改节点数据
client.setData().forPath("/app1", "app1 Node".getBytes());
//关闭客户端
client.close();
}
/**
* 获取节点数据
* 步骤:
* 1、启动客户端
* 2、获取节点数据
* 3、关闭客户端
*/
@Test
public void findNodeData() throws Exception {
//启动客户端
client.start();
//获取节点数据(返回字节数组)
byte[] bytes = client.getData().forPath("/app2");
System.out.println("App2节点数据=" + new String(bytes));
//关闭客户端
client.close();
}
/**
* 节点的删除(正常删除一个子节点)
* 步骤:
* 1、启动客户端
* 2、删除节点
* 3、关闭客户端
*/
@Test
public void deleteNode01() throws Exception {
//启动客户端
client.start();
//正常删除一个子节点
client.delete().forPath("/app1");
//关闭客户端
client.close();
}
/**
* 节点的删除(递归删除一个子节点)
* 步骤:
* 1、启动客户端
* 2、删除节点
* 3、关闭客户端
*/
@Test
public void deleteNode02() throws Exception {
//启动客户端
client.start();
//递归删除一个子节点
client.delete().deletingChildrenIfNeeded().forPath("/app4");
//关闭客户端
client.close();
}
/**
* 节点的删除(强制保证删除一个节点)
* 比如遇到一些网络异常的情况,此guaranteed的强制删除会很有效果
* 步骤:
* 1、启动客户端
* 2、删除节点
* 3、关闭客户端
*/
@Test
public void deleteNode03() throws Exception{
//启动客户端
client.start();
//保证强制删除一个节点
client.delete().guaranteed().forPath("/app5");
//关闭客户端
client.close();
}
}
Zookeeper的监听机制
/**
* Zookeeper的监听机制
*/
public class ZkWatch {
/**
* NodeCache是用来监听节点数据变化的,当监听的节点的数据发生变化时就会回调对应的函数
* 步骤:
* 1、创建重试策略
* 2、创建客户端使用重试策略
* 3、开启客户端
* 4、创建节点数据监听对象
* 5、开始缓存(true:可以直接获取监听节点。false:不可以获取监听的节点)
* 6、添加监听对象(如果节点数据有变化,会回调该方法)
*
* @throws Exception 失败异常
*/
@Test
public void nodeCacheTest() throws Exception {
//1.创建重试策略
RetryPolicy retryPolicy = new ExponentialBackoffRetry(3000, 3);
//2.创建客户端
CuratorFramework client = CuratorFrameworkFactory
.newClient("192.168.10.101:2181", 1000, 1000, retryPolicy);
//3.开启客户端
client.start();
System.out.println("连接Zookeeper服务成功");
//4.创建节点监听对象 NodeCache(参数1:哪个客户端,参数2:监听那个节点)
final NodeCache nodeCache = new NodeCache(client, "/hello");
//5.开始缓存(true:可以直接获取监听节点。false:不可以获取监听的节点)
nodeCache.start(true);
//6.添加监听对象(如果节点数据有变化,会回调该方法)
nodeCache.getListenable().addListener(new NodeCacheListener() {
public void nodeChanged() throws Exception {
//如果回调方法被调用,获取节点中最新的数据
ChildData data = nodeCache.getCurrentData();
//打印最新节点数据
System.out.println("节点数据: path ==> " + data.getPath() + " 数据内容: ==> " + new String(data.getData()));
}
});
//阻塞程序的执行,让程序一直执行
System.in.read();
}
/**
* PathChildrenCache是用来监听指定节点的子节点变化情况
* 步骤:
* 1、创建重试策略
* 2、创建客户端,使用重试策略
* 3、开启客户端
* 4、创建节点的数据监控对象
* 5、开始缓存(设置启动模式)
* 6、添加监听对象(如果节点有变化,会回调该方法)
*
* @throws Exception 失败异常
*/
@Test
public void nodePathChildrenCache() throws Exception {
//1.创建重试策略
RetryPolicy retryPolicy = new ExponentialBackoffRetry(3000, 3);
//2.创建客户端,使用重试策略
CuratorFramework client = CuratorFrameworkFactory
.newClient("192.168.10.101:2181", 1000, 1000, retryPolicy);
//3.开启客户端
client.start();
//4.创建节点的数据监控对象(参数1:连接对象,参数2:节点名称,参数3:[如果为false则无法读取到数据内容,如果为true则客户端在接收到节点列表改变的同时,也能够获取到节点数据内容])
final PathChildrenCache pathChildrenCache = new PathChildrenCache(client, "/hello", true);
//5.开始缓存(设置启动模式)
//三种启动模式:
// 1、NORMAL:普通启动模式,在启动时缓存子节点数据
// 2、POST_INITIALIZED_EVENT:在启动时缓存节点数据,提示初始化
// 3、BUILD_INITIAL_CACHE:在启动时什么都不会输出
pathChildrenCache.start(PathChildrenCache.StartMode.POST_INITIALIZED_EVENT);
//6.添加监听对象(如果节点有变化,会回调该方法)
pathChildrenCache.getListenable().addListener(new PathChildrenCacheListener() {
/**
* 一共有7种事件类型
* 1.PathChildrenEvent.CHILD_ADDED 子节点添加,
* 2.PathChildrenEvent.CHILD_UPDATED 子节点修改,
* 3.PathChildrenEvent.CHILD_REMOVED 子节点删除,
* 4.PathChildrenEvent.CONNECTION_SUSPENDED 连接超时,
* 5.PathChildrenEvent.CONNECTION_RECONNECTED, 重新连接
* 6.PathChildrenEvent.CONNECTION_LOST, 连接超时一段时间
* 7.PathChildrenEvent.INITIALIZED 初始化完成;
* @param curatorFramework 客户端对象
* @param Event 当前监听的节点事件对象
* @throws Exception 异常
*/
public void childEvent(CuratorFramework curatorFramework, PathChildrenCacheEvent Event) throws Exception {
//回调方法
//子节点添加
if (Event.getType() == PathChildrenCacheEvent.Type.CHILD_ADDED) {
System.out.println("添加了一个子节点; 节点路径==>" + Event.getData().getPath() + " 节点数据==>" + new String(Event.getData().getData()));
} else if (Event.getType() == PathChildrenCacheEvent.Type.CHILD_UPDATED) {
System.out.println("修改了一个子节点; 节点路径==>" + Event.getData().getPath() + " 节点数据==>" + new String(Event.getData().getData()));
} else if (Event.getType() == PathChildrenCacheEvent.Type.CHILD_REMOVED) {
System.out.println("删除了一个子节点; 节点路径==>" + Event.getData().getPath() + " 节点数据==>" + new String(Event.getData().getData()));
} else if (Event.getType() == PathChildrenCacheEvent.Type.CONNECTION_SUSPENDED) {
System.out.println("连接超时");
} else if (Event.getType() == PathChildrenCacheEvent.Type.CONNECTION_RECONNECTED) {
System.out.println("重新连接");
} else if (Event.getType() == PathChildrenCacheEvent.Type.CONNECTION_LOST) {
System.out.println("连接超时一段时间");
} else if (Event.getType() == PathChildrenCacheEvent.Type.INITIALIZED) {
System.out.println("初始化完成");
}
}
});
//阻塞程序的执行,让程序一直执行
System.in.read();
}
/***
* TreeCache既能够监听自节点的变化,也能够监听子节点的变化【重要,需牢记】
* 步骤:
* 1、创建连接重试策略
* 2、创建客户端,使用重试策略
* 3、开启客户端
* 4、创建节点的数据监听对象
* 5、开始缓存
* 6、添加监听对象(如果节点数据有变化,会回调该方法)
* @throws Exception 异常
*/
@Test
public void nodeTreeCache() throws Exception {
//1.创建重试策略
RetryPolicy retryPolicy = new ExponentialBackoffRetry(3000, 3);
//2.创建客户端,使用重试策略
CuratorFramework client = CuratorFrameworkFactory
.newClient("192.168.10.101:2181", 1000, 1000, retryPolicy);
//3.开启客户端
client.start();
//4.创建节点的数据监听对象
//参数1:连接对象
//参数2:节点名称
TreeCache treeCache = new TreeCache(client, "/hello");
//5.开始缓存
treeCache.start();
//6.添加监听对象(如果节点数据有变化,会回调该方法)
//TreeCacheEvent.Type.NODE_ADDED, 子节点添加
//TreeCacheEvent.Type.NODE_UPDATED, 子节点更新
//TreeCacheEvent.Type.NODE_REMOVED, 子节点删除
//TreeCacheEvent.Type.CONNECTION_SUSPENDED, 待定
//TreeCacheEvent.Type.CONNECTION_RECONNECTED, 重新连接
//TreeCacheEvent.Type.CONNECTION_LOST, 连接超时一段时间
//TreeCacheEvent.Type.INITIALIZED, 初始化完成
treeCache.getListenable().addListener(new TreeCacheListener() {
public void childEvent(CuratorFramework client, TreeCacheEvent Event) throws Exception {
if (Event.getType() == TreeCacheEvent.Type.NODE_ADDED) {
System.out.println("添加了一个子节点; 节点路径==>" + Event.getData().getPath() + " 节点数据==>" + new String(Event.getData().getData()));
} else if (Event.getType() == TreeCacheEvent.Type.NODE_UPDATED) {
System.out.println("更新了一个子节点; 节点路径==>" + Event.getData().getPath() + " 节点数据==>" + new String(Event.getData().getData()));
} else if (Event.getType() == TreeCacheEvent.Type.NODE_REMOVED) {
System.out.println("删除了一个子节点; 节点路径==>" + Event.getData().getPath() + " 节点数据==>" + new String(Event.getData().getData()));
} else if (Event.getType() == TreeCacheEvent.Type.CONNECTION_SUSPENDED) {
System.out.println("暂停了一个子节点; 节点路径==>" + Event.getData().getPath() + " 节点数据==>" + new String(Event.getData().getData()));
} else if (Event.getType() == TreeCacheEvent.Type.CONNECTION_RECONNECTED) {
System.out.println("重新连接了");
} else if (Event.getType() == TreeCacheEvent.Type.CONNECTION_LOST) {
System.out.println("连接超时了一段时间");
} else if (Event.getType() == TreeCacheEvent.Type.INITIALIZED) {
System.out.println("初始化完成");
}
}
});
//阻塞程序的执行,让程序一直执行
System.in.read();
}
}
Zookeeper Java API操作流程的更多相关文章
- 9. 使用ZooKeeper Java API编程
ZooKeeper是用Java开发的,3.4.6版本的Java API文档可以在http://zookeeper.apache.org/doc/r3.4.6/api/index.html上找到. Ti ...
- Zookeeper java api
Zookeeper java api 主要有以下几个: 方法名称 描述 String create(final String path, byte data[], List acl, CreateM ...
- 14.ZooKeeper Java API 使用样例
转自:http://www.aboutyun.com/thread-7332-1-1.html package com.taobao.taokeeper.research.sample; import ...
- zookeeper Java API 简单操作示例
本文主要介绍如何在java IDE中如何应用使用客户端与zookeeper服务器通信. 首先搭建maven环境,并在pom文件中加入zookeeper引用包: <!-- https://mvnr ...
- Zookeeper JAVA API的使用
0. 前言 zookeeper安装及使用 http://www.cnblogs.com/rocky-fang/p/7880309.html 1. 开发环境配置 1.1 idea创建一个maven工程 ...
- zookeeper JAVA API 简单操作
package org.admln.program.Zoo_Test; import java.io.IOException; import java.security.NoSuchAlgorithm ...
- Zookeeper Java API调用
引入zookeeper-3.4.11.jar public class ZooKeeperTest implements Watcher{ //public final static String z ...
- zookeeper java api(使用java代码操作zookeeper)
1 导入相关的pom依赖 <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId&g ...
- Zookeeper Curator API 使用
0. 原生 ZOOKEEPER JAVA API http://www.cnblogs.com/rocky-fang/p/9030438.html 1. 概述 Curator采用cache封装对事件 ...
- ZooKeeper Java例子(六)
A Simple Watch Client 为了向你介绍ZooKeeper Java API,我们开发了一个非常简单的监视器客户端.ZooKeeper客户端监视一个ZooKeeper节点的改变并且通过 ...
随机推荐
- 论文解读《MASTERKEY: Automated Jailbreaking of Large Language Model Chatbots》
导言 在参加东南大学网络安全学院夏令营的契机下,我第一次接触大模型安全领域.L老师是网络安全领域的一位大牛,在和L老师交流期间,被告知需要准备一次paper presentation介绍四大会中感 ...
- Java日期时间API系列28-----Jdk8中java.time包中的新的日期时间API类,计算节假日和二十四节气。
1.节日信息计算代码 package com.xkzhangsan.time.holiday; import java.time.DayOfWeek; import java.time.LocalDa ...
- iOS字符串大小写转换使用小结
iOS开发中字符串用的比较多,追加,拆分,截取,替换,比较,大小写转换使用的频率还挺高.今天看oc技术书的时候看到关于大小写转换的地方,有一个说的是所有字母首字母大写,还是第一次看到,记录一下,以备后 ...
- 2. 王道OS-操作系统的特征,发展和分类
1. 并发:宏观上是同时发生的,微观是交替发生的 :ps:并行:宏观和微观都是同时发生的 : ps:单核CPU同一时刻只能执行一个程序,各个程序只能并发的执行 : 多核CPU同一时刻可以同时执行多个程 ...
- 使用Pydantic和SqlAlchemy实现树形列表数据(自引用表关系)的处理,以及递归方式处理数据差异
在我的设计框架业务中,字典大类.部门机构.系统菜单等这些表,都存在id.pid的字段,主要是作为自引用关系,实现树形列表数据的处理的,因为这样可以实现无限层级的树形列表.在实际使用Pydantic和S ...
- 人形机器人是未来?6只手臂加AI模型,异形机器人重塑种植业。
图源:reddit user IlustriousTea 近日,一则视频在媒体上引起了人们的讨论.国外一处苹果园里,机械嗡鸣声中,六只机械手熟练且快速地采摘成熟的苹果. 这是2018年于美国加利福尼亚 ...
- MindSponge分子动力学模拟——增强采样(2024.11)
技术背景 关于增强采样(Enhanced Sampling)算法的具体原理,这里暂不做具体介绍,感兴趣的童鞋可以直接参考下这篇综述文章:Enhanced sampling in molecular d ...
- .NET Core 泛型底层原理浅谈
简介 泛型参考资料烂大街,基本资料不再赘述,比如泛型接口/委托/方法的使用,逆变与协变. 泛型好处有如下几点 代码重用 算法重用,只需要预先定义好算法,排序,搜索,交换,比较等.任何类型都可以用同一套 ...
- 安卓微信小程序开发之“蓝牙”
一.写在前面 在微信当中是支持两种蓝牙模式,分别是"经典蓝牙--BT"和"低功耗蓝牙--BLE".通常在和外围单片机设备进行连接的时候用的是低功耗蓝牙这个模式, ...
- C# Winform 子窗体提交后更新父窗体datagridview数据(事件和委托)
首先整理思路 子类调用父类的dgv控件,如果是使用委托和事件的方式,应该在子类定义委托和事件. 见图1 父类将刷新datagridview的方法传入事件中. 见图2 子类再调用此事件.见图3 那么父窗 ...