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中根据事件的动作来区分不同的事件源对象,动 ...
随机推荐
- jquery-base64.js插件使用
官方文档地址:https://github.com/yckart/jquery.base64.js var a="123"; var b=$.base64.btoa(a); con ...
- GDOI2014模拟 旅行【SPFA】
旅行(travel) 从前有一位旅者,他想要游遍天下所有的景点.这一天他来到了一个神奇的王国:在这片土地上,有n个城市,从1到n进行编号.王国中有m条道路,第i条道路连接着两个城市ai,bi,由于年代 ...
- sublime Text3+emmet(快速开发)
sublime软件使用Emmet插件快速编写CSS样式 基本的CSS样式编写时,很多样式只需输入首字母即可得到不带属性值的CSS样式,像上面说到的margin.而 ...
- Android中java层使用LocalSocket和底层进行通讯
原始文件:frameworks\base\services\java\com\android\server\NativeDaemonConnector.java private void listen ...
- Android开发学习-view
题记:抱着对Android开发的浓厚兴趣,加入了Study jams的线上学习小组,开启了自己的Android学习之旅.一.学习前准备:1.自己动手搭建了"Android Studio&qu ...
- 用ElasticSearch搭建自己的搜索和分析引擎
作者:robben,腾讯高级工程师 商业转载请联系腾讯WeTest获得授权,非商业转载请注明出处. 导语:互联网产品中的检索功能随处可见.当你的项目规模是百度大搜|商搜或者微信公众号搜索这种体量的时候 ...
- CocoaAsyncSocket + Protobuf 处理粘包和拆包问题
在上一篇文章<iOS之ProtocolBuffer搭建和示例demo>分享环境的搭建, 我们和服务器进行IM通讯用了github有名的框架CocoaAsynSocket, 然后和服务器之间 ...
- CSS border实现各个方向等腰直角三角
CSS代码: .border_cort, .border_corr, .border_corb, .border_corl { display: inline-block; ; ; border-wi ...
- MongoDB系列:把mongodb作为windows的服务来启动
1.首先切换到mongodb安装目录下的bin目录,在控制台直接运行以下命令 "C:\Program Files\MongoDB\Server\3.0\bin\mongod.exe" ...
- avalon2对比avalon1 新增的功能汇总
avalon2.0 与1.4,1.5相比, 2.0是移除了ms-repeat, ms-each, ms-with, ms-include, ms-include-src,ms-data, ms-sca ...