1.ZooKeeper Watcher

  ZooKeeper 提供了分布式数据发布/订阅功能,一个典型的发布/订阅模型系统定义了一种一对多的订阅关系,能让多个订阅者同时监听某一个主题对象,

当这个主题对象自身状态变化时,会通知所有订阅者,使他们能够做出相应的处理

  ZooKeeper 中,引入了 Watcher 机制来实现这种分布式的通知功能。ZooKeeper 允许客户端向服务端注册一个 Watcher 监听,当服务端的一些事件触

发了这个 Watcher,那么就会向指定客户端发送一个事件通知来实现分布式的通知功能。

  触发事件种类很多,如:节点创建,节点删除,节点改变,子节点改变等: 

可以设置观察的操作:exists,getChildren,getData

可以触发观察的操作:create,delete,setData

  总的来说可以概括 Watcher 为以下三个过程:客户端向服务端注册 Watcher、服务端事件发生触发 Watcher、客户端回调 Watcher 得到触发事件情况

2.Watch 机制特点

  一次性触发:事件发生触发监听,一个 watcher event 就会被发送到设置监听的客户端,这种效果是一次性的,后续再次发生同样的事件,不会再次触发

  事件封装 :ZooKeeper 使用 WatchedEvent 对象来封装服务端事件并传递,WatchedEvent 包含了每一个事件的三个基本属性:

通知状态(keeperState),事件类型(EventType)和节点路径(path)

  Event 异步发送:watcher 的通知事件从服务端发送到客户端是异步的。

  先注册再触发:Zookeeper 中的 watch 机制,必须客户端先去服务端注册监听,这样事件发送才会触发监听,通知给客户端

3.通知状态和事件类型

  同一个事件类型在不同的通知状态中代表的含义有所不同,下表列举了常见的通知状态和事件类型(先注册才能设置监听)

  

  其中连接状态事件(type=None, path=null)不需要客户端注册,客户端只要有需要直接处理就行了

4.Shell 客户端设置 watcher

  设置节点数据变动监听:

  

  通过另一个客户端更改节点数据:

  

  此时设置监听的节点收到通知:

  

2.org.apache.zookeeper.Watcher

  Watcher 接口表示一个标准的事件处理器,其定义了事件通知相关的逻辑,包含 KeeperState 和 EventType 两个枚举类,分别代表了通知状态和事件类型,

同时定义了事件的回调方法:process(WatchedEvent event)

  process 方法是 Watcher 接口中的一个回调方法,当 ZooKeeper 向客户端发送一个 Watcher 事件通知时,客户端就会对相应的 process 方法进行回调,

从而实现对事件的处理。 

if (event.getState() == KeeperState.SyncConnected) {
latch.countDown();
} // 发生了waitPath的删除事件
if (event.getType() == EventType.NodeDeleted && event.getPath().equals(waitPath)) {
doSomething();
}

  

  

  

  

 

  

  

  
  

  

最新文章

  1. java并发编程-基础
  2. ${pageContext.request.contextPath}无效
  3. 透过 HoloLens,微软抢先看到了个人计算机的未来
  4. 【android】实现一个自己的标题栏
  5. ckeditor添加插入flv视频的插件
  6. LeetCode() Search a 2D MatrixII
  7. Java ClassLoader基础及加载不同依赖 Jar 中的公共类(转)
  8. android压缩解压zip文件
  9. Weexpack 使用教程
  10. zookeeper配置管理+集群管理实战
  11. java 11 实现RFC7539中指定的ChaCha20和Poly1305两种加密算法, 代替RC4
  12. LCT入门总结
  13. ARP欺骗配置及演示过程
  14. MyISAM和Innodb区别,为什么?
  15. SSH三大框架的工作原理以及流程
  16. c++ 单元测试框架 gmock 深度剖析
  17. 字符串正则替换replace第二个参数是函数
  18. 编程菜鸟的日记-初学尝试编程-编写函数实现strcmp功能
  19. android view绘制流程 面试
  20. iOS:用Block写一个链式编程

热门文章

  1. 教你如何在Ubuntu上安装最新的Python版本
  2. Hbase概述
  3. SQL Pretty Printer for SSMS 很棒的格式化插件
  4. 怎么将本地项目放到码云(gitee)上面?图文详解
  5. Java基础题记录
  6. flask项目配置
  7. jdbc插入mysql时间差14个小时的解决方案
  8. Java IO与NIO的总结、比较
  9. 怎样在 Vue 里面使用自定义事件将子组件的数据传回给父组件?
  10. WEBAPI 最近更新项目时 服务器总是提示:An error has occurred.