Zookeeper系列2 原生API 以及核心特性watcher
原生API 增删改查询
public class ZkBaseTest {
static final String CONNECT_ADDR = "192.168.0.120";
static final CountDownLatch countDownLatch = new CountDownLatch(1);
public static void main(String[] args) throws Exception {
// 获取zookeeper对象
ZooKeeper zk = new ZooKeeper(CONNECT_ADDR, 20000, new Watcher() {
@Override
public void process(WatchedEvent event) {
KeeperState state = event.getState();
EventType type = event.getType();
if (KeeperState.SyncConnected == state) {
if (EventType.None == type) {
countDownLatch.countDown();
}
}
}
});
countDownLatch.await(); // 一直阻塞直到链接成功
zk.create("/test", "testdata".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
byte[] data = zk.getData("/test", false, null);
System.out.println("data " + new String(data));
zk.setData("/test", "newdata".getBytes(), -1);
byte[] afterData = zk.getData("/test", false, null);
System.out.println("afterData " + new String(afterData));
zk.delete("/test", -1); //删除过程中,需要版本检查 -1表示跳过版本检查
zk.close();
}
}
注意:节点类型分为四种 临时,临时顺序 持久 持久顺序

临时节点的有效期 是当次连接开始到当次连接结束。
实际开发中,我们一般不会使用原生APi去开发,超级不好用。一般会使用
Curator或者zkclient 后面都会介绍到
Watcher
之前提到,监控机制是zookeeper的一个核心特性。是一次性触发的。
当watch监控的数据或者节点发生变化,会通知设置了该监控的client,
即watcher。Zookeeper的watch是一次性的!!!监听一次就失效
有一下两类事件(节点相关的)以及连接zookeeper相关的状态
我们主要重点关注节点相关
可以设置观察的操作:exists,getChildren,getData
可以触发观察的操作:create,delete,setData
znode以某种方式发生变化时,“观察”(watch)机制可以让客户端得到通知.可以针对ZooKeeper服务的“操作”来设置观察,该服务的其他 操作可以触发观察.
这里需要需要注意的是:exists可以监控不存在的节点,当创建了该节点以后,则这个观察会被触发,之前的那个客户端就会得到通知.而getChildren,getData不可以
另外exists(path,true)监控的就是该path节点创建 删除 修改
而getChildren(path,watcher)监控的就是该path节点下的子节点的变化(子节点的创建、修改、删除都会监控到)这里有一点不是很友好,他们对应的事件都是一个 。我们需要自己来判断
这里可以用过保存上次getChildren获得的值 ,两个通过比较就知道具体是什么变化的了。
最后注意 :监控只是一次性的,如果要一直监控,需要多次设置。
Zookeeper系列2 原生API 以及核心特性watcher的更多相关文章
- curator框架的使用以及实现分布式锁等应用与zkclient操作zookeeper,简化复杂原生API
打开zookeeper集群 先体会一下原生API有多麻烦(可略过): //地址 static final String ADDR = "192.168.171.128:2181,192.16 ...
- Zookeeper系列三:Zookeeper客户端的使用(Zookeeper原生API如何进行调用、ZKClient、Curator)和Zookeeper会话
一.Zookeeper原生API如何进行调用 准备工作: 首先在新建一个maven项目ZK-Demo,然后在pom.xml里面引入zk的依赖 <dependency> <groupI ...
- Zookeeper 系列(三)Zookeeper API
Zookeeper 系列(三)Zookeeper API 本节首先介绍 Zookeeper 的 Shell 命令,再对 Java 操作 Zookeeper 的三种方式进行讲解,本节先介绍 Zookee ...
- Zookeeper 系列(五)Curator API
Zookeeper 系列(五)Curator API 一.Curator 使用 Curator 框架中使用链式编程风格,易读性更强,使用工程方法创建连接对象使用. (1) CuratorFramewo ...
- ZooKeeper 系列(一)—— ZooKeeper核心概念详解
一.Zookeeper简介 二.Zookeeper设计目标 三.核心概念 3.1 集群角色 3.2 会话 3.3 数据节点 3.4 节点 ...
- ZooKeeper系列(一)—— ZooKeeper 简介及核心概念
一.Zookeeper简介 Zookeeper 是一个开源的分布式协调服务,目前由 Apache 进行维护.Zookeeper 可以用于实现分布式系统中常见的发布/订阅.负载均衡.命令服务.分布式协调 ...
- 【ZooKeeper系列】2.用Java实现ZooKeeper API的调用
温馨提示:在这里我再次提个小要求,希望大家能习惯看官方文档,文档虽然是英文但用词都比较简单,基本都能看懂文档表达的意思.授之以鱼不如授之以渔的道理相信大家都明白,也希望通过猿人谷的这个ZooKeepe ...
- (原) 2.1 Zookeeper原生API使用
本文为原创文章,转载请注明出处,谢谢 Zookeeper原生API使用 1.jar包引入,演示版本为3.4.6,非maven项目,可以下载jar包导入到项目中 <dependency> & ...
- ZooKeeper客户端原生API的使用以及ZkClient第三方API的使用
这两部分内容的介绍主要讲的是节点及节点内容和子节点的操作,并且讲解的节点的事件监听以及ACL授权 ZooKeeper客户端原生API的使用 百度网盘地址: http://pan.baidu.com/s ...
随机推荐
- 学习vue容易忽视的细节
1.对于自定义标签名(组件名称),Vue.js 不强制要求遵循 W3C 规则 (小写,并且包含一个短杠),尽管遵循这个规则比较好.HTML 特性是不区分大小写的.所以,当使用的不是字符串模板,came ...
- 导出Excel实现 (ASP.NET C# 代码部分)
背景: 实现导出Excel功能. 技术: ASP.NET , 采用`Aspose.Cells`第三方组件, C# 实现通用部分. 根据前台Ext Grid完成导入Excel中文列与实际存储列的对应关 ...
- Navicat工具怎么连接oracle数据库
当我们安装完oracle数据库之后,我们会想着用可视化工具连接,navicat是我们常用的可视化连接数据库的工具 当我们安装完oracle数据库的时候,我们需要先启动他 先把相应的服务启动 保证这两个 ...
- JavaWeb——jsp-config
<jsp-config> 包括 <taglib> 和 <jsp-property-group> 两个子元素.其中<taglib> 元素在JSP 1.2 ...
- 关于h5使用bpmn.js
bpmn.js网站地址:https://bpmn.io/toolkit/bpmn-js/ bpmnjs是一款工作流绘制框架,遵循了bpmn2.0规范,实现从前台绘制工作流到后台执行的效果. 图示: 但 ...
- 工作流调度器azkaban
为什么需要工作流调度系统 一个完整的数据分析系统通常都是由大量任务单元组成: shell脚本程序,java程序,mapreduce程序.hive脚本等 各任务单元之间存在时间先后及前后依赖关系 为了很 ...
- RestExpress response中addHeader 导致stackOverflow
问题描述: 最近在项目使用中要在restExpress的header中增加一个键值对,同事在使用的时候没有对header的value进行非空判断,于是在测试环境测试的时候就出现了一个异常
- leetcode416
class Solution { public boolean canPartition(int[] nums) { int sum=0; for (int num:nums) sum+= num; ...
- <记录> curl 封装函数
1. POST请求 参数1 : 请求地址 参数2 : 数组形式的参数 /** * @param string $url post请求地址 * @param array $params * @retur ...
- 图释SQL的Join
对于SQL的Join,在学习起来可能是比较乱的.我们知道,SQL的Join语法有很多inner的,有outer的,有left的,有时候,对于Select出来的结果集是什么样子有点不是很清楚.Codin ...