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中根据事件的动作来区分不同的事件源对象,动 ...
随机推荐
- Android Weekly Notes Issue #250
Android Weekly Issue #250 March 26th, 2017 Android Weekly Issue #250. 本期内容: 好几篇关于Android O预览版的文章; JU ...
- API的文档自动生成——基于CDIF的SOA基本能力
当前,作为大部分移动app和云服务后台之间的标准连接方式,REST API已经得到了绝大部分开发者的认可和广泛的应用.近年来,在新兴API经济模式逐渐兴起,许多厂商纷纷将自己的后台业务能力作为REST ...
- Linux线程的创建
一.线程与进程的区别 1.线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源. 2.进程是资源分配的基本单位.所有与该进程有关的资源,都 ...
- 高并发场景之RabbitMQ篇
上次我们介绍了在单机.集群下高并发场景可以选择的一些方案,传送门:高并发场景之一般解决方案 但是也发现了一些问题,比如集群下使用ConcurrentQueue或加锁都不能解决问题,后来采用Redis队 ...
- Poptest学员之当小厨师变成测试开发工程师
没开玩笑,这是我们的真实案例.做培训以来,各行各业转行做测试的学员见得太多了.修车的.客服的.销售的.司机的.医护的.前台的等等.职位虽然不分贵贱,但是薪资却分多少.每个人心中都有让家人和自己过上好日 ...
- Struts2基础学习(八)—Struts2防止表单重复提交
一.原因 用户重复提交表单在某些场合将会造成非常严重的后果.例如,在使用信用卡进行在线支付的时候,如果服务器的响应速度太 慢,用户有可能会多次点击提交按钮,而这可能导致那张信用卡上的金额被消 ...
- linux ssh免密码登录的原理
免密码登录原理 图解,server A免登录到server B: 1.在A上生成公钥私钥. 2.将公钥拷贝给server B,要重命名成authorized_keys(从英文名就知道含义了) 3.Se ...
- 分离你的spring配置文件,让结构更清晰
前言 接着上一篇的,这次框架的改变也成功分离了spring的配置文件. 以前,spring的配置文件从一开始的一点,到后面的逐渐变多,慢慢的,在一个spring的配置文件中就包含了好几块不同的bean ...
- oracle备份与还原(导入导出)
Oracle数据导入导出imp/exp 功能:Oracle数据导入导出imp/exp相当于oracle数据还原与备份.说明:大多情况都可以用Oracle数据导入导出完成数据的备份和还原(不会造成数据的 ...
- Google Chrome 默认非安全端口列表
1, // tcpmux7, // echo 9, // discard 11, // systat 13, // daytime 15, // netstat 17, // qotd 19, // ...