Zookeeper的Java API操作
Zookeeper的Java API操作
- 一、先启动Zookeeper集群
- 二、IDEA 环境搭建
- 三、创建子节点
- 四、获取子节点并监听节点变化
- 五、判断 Znode 是否存在
- 六、Watcher工作流程
一、先启动Zookeeper集群
二、IDEA 环境搭建
1.创建一个Maven工程:ZookeeperProject
2.在pom.xml文件添加如下内容:
<dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>RELEASE</version></dependency><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>2.8.2</version></dependency><dependency><groupId>org.apache.zookeeper</groupId><artifactId>zookeeper</artifactId><version>3.5.7</version></dependency>
</dependencies>
3.拷贝log4j.properties文件到项目根目录
需要在项目的 src/main/resources 目录下,新建一个文件,命名为“log4j.properties”,在文件中填入:
log4j.rootLogger=INFO, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
log4j.appender.logfile=org.apache.log4j.FileAppender
log4j.appender.logfile.File=target/spring.log
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n
三、创建子节点
package com.hyj.zk;import org.apache.zookeeper.*;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;import java.io.IOException;
import java.util.List;public class CreateZnode {//注意:逗号前后不能有空格 指定Zookeeper服务器列表private static String connectString="hadoop102:2181,hadoop103:2181,hadoop104:2181";/* sessionTimeout指会话的超时时间,是一个以“毫秒”为单位的整型值。在ZooKeeper中有会话的概念,在一个会话周期内,ZooKeeper客户端和服务端之间会通过心跳检测机制来维持会话的有效性,一旦在sessionTimeout时间内没有进行有效的心跳检测,会话就会失效。*/private static int sessionTimeout=100000;private ZooKeeper zkClient=null;@Beforepublic void init() throws IOException {//创建一个Zookeeper实例来连接Zookeeper服务器 Watcher会话监听器,服务端将会触发监听zkClient=new ZooKeeper(connectString, sessionTimeout, new Watcher() {@Override //收到事件通知后的回调函数(用户的业务逻辑)public void process(WatchedEvent watchedEvent) {}});}@Test //创建子节点public void create() throws InterruptedException, KeeperException {/* 参数 1:要创建的节点的路径; 参数 2:节点数据(一个字节数组) ;参数 3:节点权限 ;ZooDefs.Ids.OPEN_ACL_UNSAFE表示以后对这个节点的任何操作都不受权限控制参数 4:节点的类型 持久无序号节点PERSISTENT 持久带序号节点 PERSISTENT_SEQUENTIAL (persistent_sequential)短暂无序号节点EPHEMERAL 短暂带序号节点 EPHEMERAL_SEQUENTIAL (ephemeral_sequential)*/String s = zkClient.create("/sanguo/xiyouji", "sunwu".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);}@Afterpublic void close() throws InterruptedException {zkClient.close();}
}
从ZookKeeper系列:watch机制截的一张图
监听的事件类型有:
- None 客户端连接状态发生改变的时候,会收到None事件通知(如连接成功,连接失败,session会话过期等)
- NodeCreated 节点被创建
- NodeDeleted 节点被删除
- NodeDataChanged 节点数据被修改
- NodeChildrenChanged 子节点被创建或删除
四、获取子节点并监听节点变化
package com.hyj.zk;import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;import java.io.IOException;
import java.util.List;public class GetChildren {//注意:逗号前后不能有空格 指定Zookeeper服务器列表private static String connectString="hadoop102:2181,hadoop103:2181,hadoop104:2181";/* sessionTimeout指会话的超时时间,是一个以“毫秒”为单位的整型值。在ZooKeeper中有会话的概念,在一个会话周期内,ZooKeeper客户端和服务端之间会通过心跳检测机制来维持会话的有效性,一旦在sessionTimeout时间内没有进行有效的心跳检测,会话就会失效。*/private static int sessionTimeout=100000;private ZooKeeper zkClient=null;@Beforepublic void init() throws IOException {//创建一个Zookeeper实例来连接Zookeeper服务器 Watcher会话监听器,服务端将会触发监听zkClient=new ZooKeeper(connectString, sessionTimeout, new Watcher() {@Override //收到事件通知后的回调函数(用户的业务逻辑)public void process(WatchedEvent watchedEvent) {if(watchedEvent.getType() == Event.EventType.None){if(watchedEvent.getState() == Event.KeeperState.SyncConnected){System.out.println("Zookeeper连接成功!!!");}else if(watchedEvent.getState() == Event.KeeperState.Disconnected){System.out.println("客户端和服务器的连接断开!!!");}else if (watchedEvent.getState() == Event.KeeperState.Expired){System.out.println("session会话过期!!!");}}else{System.out.println(watchedEvent.getType() + "--" + watchedEvent.getPath());try {//再次监听(注册一次,监听一次)List<String> children = zkClient.getChildren("/", true); //false表示不监听,true表示使用默认的watcherfor (String child : children) {System.out.println(child);}} catch (KeeperException | InterruptedException e) {e.printStackTrace();}}}});}@Test //获取子节点并监听节点路径变化public void getChildren() throws InterruptedException, KeeperException {// 参数1: 表示监听的节点 参数2: true表示监听 ,false表示不监听List<String> children = zkClient.getChildren("/", true); //使用默认的watcherfor (String child : children) {System.out.println(child);}//延时阻塞Thread.sleep(Long.MAX_VALUE);}@Test //获取子节点不监听节点路径变化public void getChildren2() throws InterruptedException, KeeperException {// 参数1: 表示监听的节点 参数2: true表示监听 ,false表示不监听List<String> children = zkClient.getChildren("/", false); //不注册watcherfor (String child : children) {System.out.println(child);}}@Test //获取子节点并监听节点路径变化public void getChildren3() throws InterruptedException, KeeperException {// 参数1: 表示监听的节点 参数2: true表示监听 ,false表示不监听List<String> children = zkClient.getChildren("/", new Watcher() { //注册新的watcher@Override //收到事件通知后的回调函数(用户的业务逻辑)public void process(WatchedEvent watchedEvent) {System.out.println(watchedEvent.getType() + "------" + watchedEvent.getPath());try {List<String> children = zkClient.getChildren("/", false); //这里若是true它还是会使用默认的watcherfor (String child : children) {System.out.println(child);}} catch (KeeperException | InterruptedException e) {e.printStackTrace();}}});for (String child : children) {System.out.println(child);}//延时阻塞Thread.sleep(Long.MAX_VALUE);}@Afterpublic void close() throws InterruptedException {zkClient.close();}
}
五、判断 Znode 是否存在
package com.hyj.zk;import org.apache.zookeeper.*;
import org.apache.zookeeper.data.Stat;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;import java.io.IOException;
import java.util.List;public class IsExistNode {//注意:逗号前后不能有空格 指定Zookeeper服务器列表private static String connectString = "hadoop102:2181,hadoop103:2181,hadoop104:2181";/* sessionTimeout指会话的超时时间,是一个以“毫秒”为单位的整型值。在ZooKeeper中有会话的概念,在一个会话周期内,ZooKeeper客户端和服务端之间会通过心跳检测机制来维持会话的有效性,一旦在sessionTimeout时间内没有进行有效的心跳检测,会话就会失效。*/private static int sessionTimeout = 100000;private ZooKeeper zkClient = null;@Beforepublic void init() throws IOException {//创建一个Zookeeper实例来连接Zookeeper服务器 Watcher会话监听器,服务端将会触发监听zkClient = new ZooKeeper(connectString, sessionTimeout, new Watcher() {@Override //收到事件通知后的回调函数(用户的业务逻辑)public void process(WatchedEvent watchedEvent) {if (watchedEvent.getType() != Event.EventType.None) {System.out.println(watchedEvent.getType() + "--" + watchedEvent.getPath());try {List<String> children = zkClient.getChildren("/", false); //false表示不监听,true表示使用默认的watcherfor (String child : children) {System.out.println(child);}} catch (KeeperException | InterruptedException e) {e.printStackTrace();}}}});}@Testpublic void exist() throws InterruptedException, KeeperException {// 参数1: 表示要判断的节点 参数2: true表示监听 ,false表示不监听Stat stat = zkClient.exists("/sanguo", false); //不注册watcherSystem.out.println(stat == null ? "not exist" : "exist");}@Testpublic void exist2() throws InterruptedException, KeeperException {// 参数1: 表示要判断的节点 参数2: true表示监听此节点变化 ,false表示不监听Stat stat = zkClient.exists("/sanguo", true); //使用默认的watcherSystem.out.println(stat == null ? "not exist" : "exist");//延时阻塞Thread.sleep(Long.MAX_VALUE);}@Testpublic void exist3() throws InterruptedException, KeeperException {// 参数1: 表示要判断的节点 参数2: true表示监听此节点变化 ,false表示不监听Stat stat = zkClient.exists("/sanguo", new Watcher() {@Override //收到事件通知后的回调函数(用户的业务逻辑)public void process(WatchedEvent watchedEvent) { //注册新的watcherSystem.out.println(watchedEvent.getType() + "--" + watchedEvent.getPath());try {List<String> children = zkClient.getChildren("/", false); //false表示不监听,true表示使用默认的watcherfor (String child : children) {System.out.println(child);}} catch (KeeperException | InterruptedException e) {e.printStackTrace();}}});System.out.println(stat == null ? "not exist" : "exist");//延时阻塞Thread.sleep(Long.MAX_VALUE);}@Afterpublic void close() throws InterruptedException {zkClient.close();}
}
六、Watcher工作流程
Client 向 Zookeeper 服务端注册一个 Watcher ,同时将Watcher对象存储在客户端的 WatcherManager 中。当Zookeeper 服务端的一些指定事件触发了 Watcher 事件时,就会向客户端发送事件通知,客户端就会从WatcherManager 中取出对应的 Watcher 进行回调。
Watcher工作机制分为三个过程:
-
客户端注册Watcher
-
服务端处理Watcher
-
客户端回调Watcher
相关文章:
Zookeeper的Java API操作
Zookeeper的Java API操作一、先启动Zookeeper集群二、IDEA 环境搭建三、创建子节点四、获取子节点并监听节点变化五、判断 Znode 是否存在六、Watcher工作流程一、先启动Zookeeper集群 二、IDEA 环境搭建 1.创建一个Maven工程:ZookeeperProject 2.在pom.xml文件添…...
Web3:前端知识和后端知识基础
三.Web3:前端知识和后端知识基础 1.了解前端开发 2.了解JSP 3.了解JAVAWeb的三大组件 4.Servlet的使用 5.Filter的使用 6.了解thymeleaf 未更新 三.Web3:前端知识和后端知识基础 1.了解前端开发 ①前端架构 HTML超文本标记语言CSS层叠样式表JavaS...
调试射频TX和rx实验工程出现的问题与反思
1.今天用ADS仿真 发现 加上SMA 插损就到了4db,但是直接用传输线就在1db以内 这个问题我目前想到的排查思路是换成IPEX, 换成IPEX插损就变成2db 拿最新的7626去看 看到上面是SMA-3G 小针 还是结合参考的demo PCB来看 2.用射频的ipex测试LNA 发现校准…...
代码随想录刷题-数组总结篇
文章目录数组二分查找原理习题题目1思路和代码题目-2移除元素习题我的想法暴力解法双指针有序数组的平方习题暴力排序双指针长度最小的子数组习题暴力解法滑动窗口螺旋矩阵 II习题我的解法别人的解法总结数组 二分查找 本节对应代码随想录中:代码随想录-二分查找 …...
Qt读xml文件
QXmlStreamReaderQXmlStreamReader类通过简单的流式API为我们提供了一种快速的读取xml文件的方式。他比Qt自己使用的SAX解析方式还要快。所谓的流式读取即将一个xml文档读取成一系列标记的流,类似于SAX。而QXmlStreamReader类和SAX的主要区别就是解析这些标记的方式…...
Qt样式表
1>样式表介绍 样式表可通过 QApplication::setStyleSheet()函数将其设置到整个应用程序上,也可以使用 QWidget::setStyleSheet()将其设置到指定的部件或子部件上,不同级别均可设置样式表,称为样式表的层叠。样式表也可通过设计模式编辑样…...
Docker与微服务实战2022
基础篇(零基小白)1.Docker简介1.1 是什么问题:为什么会有docker出现?您要如何确保应用能够在这些环境中运行和通过质量检测?并且在部署过程中不出现令人头疼的版本、配置问题,也无需重新编写代码和进行故障修复? 答案就…...
Linux(传输层二)
文章目录0. 前言1. TCP协议1-1 TCP协议段格式1. TCP如何解包?2. TCP协议如何交付(应用层- - 客户)?3. 如何理解报文本身?4. 如何理解报文字段?1-2 确认应答(ACK)机制1-3 超时重传机制1-4 连接管理机制1. TC…...
4.Spring Cloud (Hoxton.SR8) 学习笔记—Nacos微服务治理、Nacos配置管理
本文目录如下:一、Nacos微服务治理Nacos 下载 与 启动Spring Cloud 集成 NacosIDEA 同一个 Application 启动多次Nacos - 配置集群Nacos - 设置负载均衡Nacos - 设置服务实例的权重二、Nacos 配置管理Nacos - 合理的把配置信息迁移到 Nacos 中Nacos - 配置命名规范N…...
卷王都在偷偷准备金三银四了...
年终奖没发; 简历石沉大海; 发消息只读不回 打开某招聘,看了看岗位,这个厂还不错,可是要求好高,我啥都不会。 “哎,算了,我简历还没更新呢,我躺到6月份拿到年终奖再跑…...
【C++的OpenCV】第十二课-OpenCV图像常用操作(九):找到图像的边界(轮廓)findContours()和drawContours()
🎉🎉🎉欢迎各位来到小白piao的学习空间!\color{red}{欢迎各位来到小白piao的学习空间!}欢迎各位来到小白piao的学习空间!🎉🎉🎉 💖💖💖…...
传奇开服流程—传奇单机架设教程
现在传奇私服还是那么的火爆,上次有报道发布站一年盈利几个亿,还是有很大的机会,很多玩家因为GM开服关服给折腾,刚充的钱服务器就关了,很是恼火,于是都想自己整个服开开,但又不知道从何下手&…...
【GoF 23】篇3:抽象工厂
1. 什么是抽象工厂? 提供一个创建一系列相关或互相依赖的对象接口,而无需指定它们的具体类。 抽象工厂是一个超级工厂,是其他工厂的工厂,或将简单工厂进一步抽象。 这样来理解: 我们将科技公司可以做的事情简要枚举…...
软考高级信息系统项目管理师系列之三十七:流程管理
软考高级信息系统项目管理师系列之三十七:流程管理 一、流程管理内容二、流程管理基础概念知识1.企业业务流程的整体目标2.业务流程的核心3.流程六要素4.良好的业务流程管理步骤5.企业流程管理的层次三、流程管理过程1.业务流程分析2.业务流程分析的主要方法3.业务流程分析工具…...
【WPS文字-Word】WPS文字设置段落居中对齐后公式左边右边的文字仍然无法跟公式对齐,公式和文字对不齐
一、问题背景 原来的公式左边文字是底端,右边文字是居中,我想着让左右文字全跟公式居中对齐,就全部设置了段落居中对齐。 结果发现,公式左右边的文字依然无法居中对齐。左边的文字是居中,但是右边的文字变成了顶端对…...
英文术语对照
underlying asset 标的资产 leverage 杠杆 forward 远期 futures 期货 options 期权 delivery 交割 broker 证券机构/经理人 CBOT 芝加哥交易所 long futures position 多头 short futures position 空头 spot price 现货价格 future price 期货价格 over-the-coun…...
CSS 扫盲
✏️作者:银河罐头 📋系列专栏:JavaEE 🌲“种一棵树最好的时间是十年前,其次是现在” 目录引入方式内部样式内联样式外部样式CSS 选择器CSS 常用属性值字体属性设置字体大小粗细文字样式文本属性文本颜色文本对齐文本装…...
【Redis黑马点评】基于session实现登录【短信验证码登录、登录验证功能、拦截器】过程详解
文章目录一. 黑马点评Redis项目实践1.1开发环境搭建1.1.1 数据库1.1.2 Springboot项目1.1.3 前端配置1.2 基于session实现登录1.2.1 发送短信验证码1.2.2 短信验证码登录1.2.3 登录验证功能1.2.3.1 编写拦截器一. 黑马点评Redis项目实践 1.1开发环境搭建 1.课程介绍ÿ…...
【C++】通过priority_queue、reverse_iterator加深对于适配器和仿函数的理解
苦尽甘来 文章目录一、仿函数(仿函数就是一个封装()运算符重载的类)1.C语言的函数指针2.C的仿函数对象二、priority_queue中的仿函数1.模拟实现优先级队列1.1 优先级队列的本质(底层容器为vector的适配器)1.2 向下调整算法建堆1.3…...
网络安全 -- 常见的攻击方式和防守
网络安全 – 常见的攻击方式和防守 一 . 网页中出现黑链 特点: 隐藏,不易发现,字体大小是0,表面上看不出来,代码层面可以查出来,也可能极限偏移,颜色一致 表现: 多表现为非法植入链接,一般点击会跳转至其他网页 例如: 1.澳门新葡京等赌博网站,获取流量,有人甚至会充钱参与赌…...
通用GUI编程技术——Win32 原生编程实战(十八)——GDI 设备上下文(HDC)完全指南
通用GUI编程技术——Win32 原生编程实战(十八)——GDI 设备上下文(HDC)完全指南 前面一系列文章我们聊了对话框、控件、资源这些内容,我们的窗口已经能够显示各种控件了。但你可能已经发现了一个问题:我们所…...
LVGL 7.11.0 Chart控件实战:5分钟搞定动态心率折线图(附完整代码)
LVGL 7.11.0 Chart控件实战:5分钟搞定动态心率折线图(附完整代码) 在嵌入式设备上实现流畅的数据可视化一直是开发者的痛点。LVGL作为轻量级图形库,其Chart控件能完美解决这一问题。本文将手把手教你用LVGL 7.11.0的Chart控件&am…...
ABC系统实战指南:逻辑综合与形式验证的数字电路设计工具
ABC系统实战指南:逻辑综合与形式验证的数字电路设计工具 【免费下载链接】abc ABC: System for Sequential Logic Synthesis and Formal Verification 项目地址: https://gitcode.com/gh_mirrors/ab/abc 在现代数字电路设计流程中,逻辑综合与形式…...
避开Codesys电子凸轮Cam表设置的3个常见坑:SMC_CAMXYVA结构体赋值与MC_CAM_REF实例化详解
Codesys电子凸轮Cam表实战避坑指南:从结构体赋值到功能块调优 在工业自动化领域,电子凸轮技术正在逐步取代传统的机械凸轮系统。作为Codesys平台下的核心运动控制功能,Cam表的正确配置直接关系到设备运行的精度和稳定性。本文将深入剖析手动编…...
告别手打公式!用SimpleTex截图转LaTeX+Axmath微调+Typora排版的保姆级教程
数学公式高效处理全流程:从截图识别到专业排版 每次在论文或笔记中插入复杂的数学公式时,你是否也经历过这样的痛苦?反复核对LaTeX代码中的每个括号,调整上下标位置,或是为了一个特殊符号翻遍文档。传统的手动输入方式…...
LangChainJS设计模式:可复用AI组件的架构思想
LangChainJS设计模式:可复用AI组件的架构思想 【免费下载链接】langchainjs 项目地址: https://gitcode.com/GitHub_Trending/la/langchainjs LangChainJS是一个用于构建LLM驱动应用程序的JavaScript/TypeScript框架,它通过可复用AI组件和设计模…...
人工智能毕业设计2026方向集合
0 选题推荐 - 人工智能篇 毕业设计是大家学习生涯的最重要的里程碑,它不仅是对四年所学知识的综合运用,更是展示个人技术能力和创新思维的重要过程。选择一个合适的毕业设计题目至关重要,它应该既能体现你的专业能力,又能满足实际…...
IntelliJ IDEA突然无法启动的快速修复指南
1. IntelliJ IDEA突然无法启动的常见原因 作为一名常年与IntelliJ IDEA打交道的开发者,我遇到过无数次IDE突然罢工的情况。最让人头疼的是,明明昨天还用得好好的,今天双击图标却毫无反应。这种情况通常由以下几个原因导致: 首先是…...
【AI重塑科研】无需通读全文,三步教你用大模型高效产出文献综述
1. 为什么你需要AI辅助文献综述? 每次打开文献库看到上百篇待读论文就头皮发麻?我完全理解这种感受。去年准备开题报告时,导师要求我两周内完成50篇核心文献的综述,当时差点崩溃。直到我发现用大模型处理文献可以节省90%的时间&am…...
Stable Diffusion像素艺术工作站:Pixel Fashion Atelier支持LoRA在线热切换
Stable Diffusion像素艺术工作站:Pixel Fashion Atelier支持LoRA在线热切换 1. 像素时装锻造坊简介 Pixel Fashion Atelier是一款基于Stable Diffusion与Anything-v5的图像生成工作站,专为像素艺术创作而设计。与传统AI工具不同,它采用了复…...
