ZooKeeper监听机制
前言:Zookeeper的监听机制很多人都踩过坑,感觉实现了watcher 接口,后面节点的变化都会一一推送过来,然而并非如此。
Watch机制官方声明:一个Watch事件是一个一次性的触发器,当被设置了Watch的数据发生了改变的时候,则服务器将这个改变发送给设置了Watch的客户端,以便通知它们。
Zookeeper机制的特点:
1.一次性触发 数据发生改变时,一个watcher event会被发送到client,但是client只会收到一次这样的信息。
2.watcher event异步发送 watcher 的通知事件从server发送到client是异步的,这就存在一个问题,不同的客户端和服务器之间通过socket进行通信,由于网络延迟或其他因素导致客户端在不通的时刻监听到事件,由于Zookeeper本身提供了ordering guarantee,即客户端监听事件后,才会感知它所监视znode发生了变化。
3.数据监视 Zookeeper有数据监视和子数据监视 getdata() and exists() 设置数据监视,getchildren()设置了子节点监视
4.注册watcher getData、exists、getChildren
5. 触发watcher create、delete、setData
|
watcher里面的相关事件 |
||
|
event For "/path" |
event For "/path/child" |
|
|
create("/path") |
EventType.NodeCreated |
NA |
|
delete("/path") |
EventType.NodeDeleted |
NA |
|
setData("/path") |
EventType.NodeDataChanged |
NA |
|
create("/path/child") |
EventType.NodeChildrenChanged |
EventType.NodeCreated |
|
delete("/path/child") |
EventType.NodeChildrenChanged |
EventType.NodeDeleted |
|
setData("/path/child") |
NA |
EventType.NodeDataChanged |
|
各种操作触发的watcher事件 |
||||||||
|
"/path" |
"/path/child" |
|||||||
|
exists |
getData |
getChildren |
exists |
getData |
getChildren |
|||
|
create("/path") |
√ |
√ |
||||||
|
delete("/path") |
√ |
√ |
√ |
|||||
|
setData("/path") |
√ |
√ |
||||||
|
create("/path/child") |
√ |
√ |
√ |
|||||
|
delete("/path/child") |
√ |
√ |
√ |
√ |
||||
|
setData("/path/child") |
√ |
√ |
||||||
|
操作与watcher关系 |
|||||||
|
"/path" |
"/path/child" |
||||||
|
exists |
getData |
getChildren |
exists |
getData |
getChildren |
||
|
create("/path") |
√ |
√ |
|||||
|
delete("/path") |
√ |
√ |
√ |
||||
|
setData("/path") |
√ |
√ |
|||||
|
create("/path/child") |
√ |
√ |
√ |
||||
|
delete("/path/child") |
√ |
√ |
√ |
√ |
|||
|
setData("/path/child") |
√ |
√ |
|||||
各种watch测试
/**
* watch test
*
*/
public class App implements Watcher { private static CountDownLatch connectedSemaphore = new CountDownLatch(1);
public static Stat stat = new Stat();
ZooKeeper zooKeeper; public static void main(String[] args) throws IOException, InterruptedException, KeeperException {
String p = "/testaa";
ZooKeeper zooKeeper = new ZooKeeper("192.168.1.10:2181", 5000, new App());
connectedSemaphore.await();
//exists register watch
zooKeeper.exists(p, true);
String path = zooKeeper.create(p, "456".getBytes(), Ids.OPEN_ACL_UNSAFE,
CreateMode.PERSISTENT);
//get register watch
zooKeeper.getData(path, true, stat);
zooKeeper.setData(path, "hhhh".getBytes(), -1);
zooKeeper.exists(path, true);
//exists register watch
zooKeeper.delete(path, -1); } public void process(WatchedEvent event) {
if (KeeperState.SyncConnected == event.getState()) {
if (EventType.None == event.getType() && null == event.getPath()) {
connectedSemaphore.countDown();
System.out.println("Zookeeper session established");
} else if (EventType.NodeCreated == event.getType()) {
System.out.println("success create znode"); } else if (EventType.NodeDataChanged == event.getType()) {
System.out.println("success change znode: " + event.getPath()); } else if (EventType.NodeDeleted == event.getType()) {
System.out.println("success delete znode"); } else if (EventType.NodeChildrenChanged == event.getType()) {
System.out.println("NodeChildrenChanged"); } }
}
}
ZooKeeper监听机制的更多相关文章
- Zookeeper数据类型、节点类型、角色、watcher监听机制
1.Zookeeper数据类型:层次化目录结构+少量数据 Zookeeper包含层次化的目录结构,每个Znode都有唯一的路径标识,Znode可以包含数据和子节点. 其中Znode数据可以有多个版本, ...
- 4.JAVA之GUI编程事件监听机制
事件监听机制的特点: 1.事件源 2.事件 3.监听器 4.事件处理 事件源:就是awt包或者swing包中的那些图形用户界面组件.(如:按钮) 事件:每一个事件源都有自己特点有的对应事件和共性事件. ...
- .NET事件监听机制的局限与扩展
.NET中把“事件”看作一个基本的编程概念,并提供了非常优美的语法支持,对比如下C#和Java代码可以看出两种语言设计思想之间的差异. // C#someButton.Click += OnSomeB ...
- java 24 - 2 GUI之监听机制和适配器改进窗口关闭
我们创建了窗体后,就要对窗体进行操作,比如关闭窗口.而这时候就要建立监听机制: 事件监听机制: A:事件源 事件发生的地方 B:事件 就是要发生的事情 C:事件处理 就是针对发生的事情做出的处理方案 ...
- 关于JAVA中事件分发和监听机制实现的代码实例-绝对原创实用
http://blog.csdn.net/5iasp/article/details/37054171 文章标题:关于JAVA中事件分发和监听机制实现的代码实例 文章地址: http://blog.c ...
- 关于事件监听机制的总结(Listener和Adapter)
记得以前看过事件监听机制背后也是有一种设计模式的.(设计模式的名字记不清了,只记得背后实现的数据结构是数组.) 附上事件监听机制的分析图: 一个事件源可以承载多个事件(只要这个事件源支持这个事件就可以 ...
- GUI编程笔记(java)05:GUI事件监听机制原理和举例说明
1.事件监听机制: A:事件源 事件发生的地方 B:事件 就是要发生的事情 C:事件处理 就是针对发生的事情做 ...
- JAVA事件监听机制学习
//事件监听机制 import java.awt.*; import java.awt.event.*; public class TestEvent { public static void mai ...
- Java中的事件监听机制
鼠标事件监听机制的三个方面: 1.事件源对象: 事件源对象就是能够产生动作的对象.在Java语言中所有的容器组件和元素组件都是事件监听中的事件源对象.Java中根据事件的动作来区分不同的事件源对象,动 ...
随机推荐
- 使用Python对Access读写操作
学习Python的过程中,我们会遇到Access的读写问题,这时我们可以利用win32.client模块的COM组件访问功能,通过ADODB操作Access的文件. 1.导入模块 import win ...
- web与request
request --> 封装了客户端所有的请求数据! 请求行 请求头 空行 请求体(GET没体) 回忆一下http协议!请求协议中的数 ...
- 参加光环国际PRINCE2培训
挑战埃及是全球首套能够同时适配PRINCE2认证人群,PMP认证人群的项目管理沙盘演练游戏.沙盘通过使用乐高积木作为道具,通过一场互动性极强的情景模拟为全球项目经理还原了四千年前古埃及金字塔建造的情景 ...
- CSS3学习笔记(3)-CSS3边框
p{ font-size: 15px; } .alexrootdiv>div{ background: #eeeeee; border: 1px solid #aaa; width: 99%; ...
- 异步编程的两种模型,闭包回调,和Lua的coroutine,到底哪一种消耗更大
今天和人讨论了一下CPS变形为闭包回调(典型为C#和JS),以及Lua这种具有真正堆栈,可以yield和resume的coroutine,两种以同步的形式写异步处理逻辑的解决方案的优缺点.之后生出疑问 ...
- poptest老李谈分布式与集群
poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询qq:908821478,咨询电话010-845052 ...
- Centos安装MySql、Java、Tomcat
一.安装MySql 安装MySql yum install -y mysql-server mysql mysql-devel 启动MySql服务 service mysqld start 为root ...
- 图的基本算法(BFS和DFS)(转载)
图是一种灵活的数据结构,一般作为一种模型用来定义对象之间的关系或联系.对象由顶点(V)表示,而对象之间的关系或者关联则通过图的边(E)来表示. 图可以分为有向图和无向图,一般用G=(V,E)来表示图. ...
- JVM知识在离线数据中的运用
又是飞花的季节了.多愁善感的林妹妹看到柳絮说:“嫁与东风春不管,凭尔去,忍淹留.”宝姐姐看了却来一句:“好风凭借力送我上青云”. 特别羡慕情商高的人,经常在想他们是怎么做到的.从来看不出他们不喜欢谁, ...
- 对Qt下对话服务器客户端的总结(MyTcpServer与MyTcpClient)
在汇文培训老师给讲了这个例子.讲的挺好的 Qt编写聊天服务器与客户端主要用到下面两个类: QTcpSocket --- 处理连接的 QTcpServer --- 处理服务器,对接入进行响应,创建每个链 ...