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 ...
随机推荐
- new 对象时的暗执行顺序
为什么称为暗执行顺序,因为当我们在new 对象时,其不是简简单单的new一个完事,它要首先检查父类的,静态的,非静态的等代码,就好像我们结婚生孩子一样,要先到祖宗那里,公安局那里,左邻右舍那里,告诉他 ...
- C#编程经验-function advanced params
function advanced params:outrefparamsnot useful,to use them is a burden,so i dont use themdefects:ou ...
- Python【每日一问】04
问:a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],求出列表a中所有奇数并构造新列表 答: 利用列表的元素下标遍历列表 a = [1, 2, 3, 4, 5, 6, 7, 8 ...
- [UE4]Circular Throbber,圆形的、环形的动态图标
一.就是圆形的,转动的很多小圆点. 二.Circular Throbber.Appearance.Number Of Pieces:可以通知显示的小圆点个数. 三.Circular Throbber. ...
- 华硕R系列的解剖图
1.键盘底部 2.右侧光驱,右下硬盘 3.电源 4.主板 5. 6.4G内存
- windows下安装Kettle
先下载kettle稳定版本https://community.hitachivantara.com/docs/DOC-1009855 下载后并且解压 安装kettle必须安装jdk在你的电脑上,ket ...
- java.util.ConcurrentModificationException详解
引用于http://blog.csdn.net/dabing69221/article/details/40065071 在使用set/map时,一个可爱的小bug:Java.util.Concurr ...
- 一个java使用redis的简单案例
这个例子中,java使用Jedis来操作Redis 1.引入Jedis的依赖 <dependency> <groupId>redis.clients</groupId&g ...
- 5种必会的Java异步调用转同步的方法你会几种
转载请注明本文地址:https://www.jianshu.com/p/f00aa6f66281 源码地址:https://gitee.com/sunnymore/asyncToSync Sunny先 ...
- gentoo 工具命令
查看具体某个命令来源于哪个软件包,使用 equery,比如说查找 lsusb 来源于哪个包,可以用 equery belongs lsusb