在客户端发送命令:stat /zhang watch

在zk server中产生如下图的调用栈:

  1. //在DataTree类中有
  2. private final WatchManager dataWatches = new WatchManager();
  3.  
  4. //在WatchManager类中有
  5. private final HashMap<String, HashSet<Watcher>> watchTable =
  6. new HashMap<String, HashSet<Watcher>>();
  7.  
  8. private final HashMap<Watcher, HashSet<String>> watch2Paths =
  9. new HashMap<Watcher, HashSet<String>>();

我们详细分析addWatch代码:

  1. //path就是客户端命令中的"/zhang",而Watcher就是客户端的连接对象NIOServerCnxn
  2. //可以理解为客户端就是一个Watcher
  3. //public abstract class ServerCnxn implements Stats, Watcher
  4. //public class NIOServerCnxn extends ServerCnxn
  5. public synchronized void addWatch(String path, Watcher watcher) {
  6. //多个客户端关注一个path
  7. HashSet<Watcher> list = watchTable.get(path);
  8. if (list == null) {
  9. // don't waste memory if there are few watches on a node
  10. // rehash when the 4th entry is added, doubling size thereafter
  11. // seems like a good compromise
  12. list = new HashSet<Watcher>(4);
  13. watchTable.put(path, list);
  14. }
  15. list.add(watcher);
  16.  
  17. //一个客户端关注多个path
  18. HashSet<String> paths = watch2Paths.get(watcher);
  19. if (paths == null) {
  20. // cnxns typically have many watches, so use default cap here
  21. paths = new HashSet<String>();
  22. watch2Paths.put(watcher, paths);
  23. }
  24. paths.add(path);
  25. }

在创建、删除、设置节点数据时,会触发watch:

  1. public Set<Watcher> triggerWatch(String path, EventType type, Set<Watcher> supress) {
  2. //生成事件
  3. WatchedEvent e = new WatchedEvent(type, KeeperState.SyncConnected, path);
  4. HashSet<Watcher> watchers;
  5. synchronized (this) {
  6. //删除关注path的客户端
  7. watchers = watchTable.remove(path);
  8. if (watchers == null || watchers.isEmpty()) {
  9. if (LOG.isTraceEnabled()) {
  10. ZooTrace.logTraceMessage(LOG,
  11. ZooTrace.EVENT_DELIVERY_TRACE_MASK,
  12. "No watchers for " + path);
  13. }
  14. return null;
  15. }
  16. for (Watcher w : watchers) {
  17. //删除该客户端关注的path
  18. HashSet<String> paths = watch2Paths.get(w);
  19. if (paths != null) {
  20. paths.remove(path);
  21. }
  22. }
  23. }
  24. for (Watcher w : watchers) {
  25. if (supress != null && supress.contains(w)) {
  26. continue;
  27. }
  28. //每个客户端处理watch事件
  29. //NIOServerCnxn.process(WatchedEvent event)
  30. w.process(e);
  31. }
  32. return watchers;
  33. }

zk如何实现watch的更多相关文章

  1. zk 起别名时候碰到的问题

    第一次搭建时候都是用的ip,没什么问题,看到别人都是用的别名,于是也想试试把ip改成别名.然而 其中碰到的问题 ,快一周了才解决,现在记录下: 1.改主机别名 一直以为 修改 /etc/hosts 里 ...

  2. 基于ZK构建统一配置中心的方案和实践

    背景: 近期使用Zk实现了一个简单的配置管理的小东西,在此开源出来,有兴趣的希望提出您的宝贵意见.如果恰巧您也使用或者接触过类似的东西, 也希望您可以分享下您觉得现在这个项目可以优化和改进的地方. 项 ...

  3. ZK 使用jfreeChart

    前台: <?page title="Grid使用" contentType="text/html;charset=UTF-8"?> <zk x ...

  4. dubbo zk 分布式服务项目搭建与配置

    1. 项目 jar  -----提供接口 2. 项目 jar  -----接口实现   provider启动zk main方法启动 start applicationContext.xml <b ...

  5. ZK 最少限度加载页面js文件

    官方文档说明: ZK Developer's Reference文档,章节为Minimize Number of JavaScript Files to Load,按照文档步骤执行,最后需在 web. ...

  6. ZK textbox Constraint验证

    test.zul: <?page title="" contentType="text/html;charset=UTF-8"?> <zk x ...

  7. ZK listbox 两种分页使用及比较

    参考:http://tsinglongwu.iteye.com/blog/849923 以下代码模拟数据量大时情况,采用“<paging>”组件方式 前台Listbox.zul : < ...

  8. disconf系列【2】——解决zk部署情况为空的问题

    如下图所示,在安装完成之后,发现zk(zookeeper)部署情况为空. 注:承接上篇,环境未发生改变. 1.解决zk没有启动的问题 查看disconf日志,发现zk没有启动. 实际情况是:zk已经启 ...

  9. zk系列-zookeeper的使用

    zk支持java/c访问,java常用的有apache-zkclient.社区版的i0tec-zkclient.github.adyliu,apache-zkclient是zk自身提供的接口,i0te ...

  10. zk系列-zookeeper概述

    接触zk是2年前了,最近工作又比较依赖于zk,所以准备起个系列文章,系统的总结下. zookeeper是一个分布式的用于协调的服务,起源于Hadoop中的一个组件.分布式系统可以用zookeeper实 ...

随机推荐

  1. 实验二 Java 面向对象程序设计

    实验内容 1 初步掌握单元测试和TDD 2 理解并掌握面向对象三要素:封面,继承,多态 3 初步掌握UML建模 4 熟悉SOLID原则 5 了解设计模式 (一)单元测试 D

  2. 20165310_Exp2实验二《Java面向对象程序设计》

    实验二<Java面向对象程序设计> TDD与单元测试 前期准备: 什么是单元测试? 单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证.对于单元测试中单元的含 ...

  3. 小工具:word表格文字转化成insert语句

    群里的一个朋友有个需要,要让把word里的表格数据插入到数据库里面. 我的思路是,把格式化的数据转成insert语句,然后去执行就可以了. 要求的insert语句格式是:'insert into xx ...

  4. ubuntu下交叉编译imagemagick

    环境:ubuntu16.04 交叉编译器版本号:4.8.3 在编译之前要编译以下其依赖的软件或库:freetype,libpng,libxml2,libtiff,libjpeg,zlib,graphv ...

  5. BZOJ3297: [USACO2011 Open]forgot DP+字符串

    Description 发生了这么多,贝茜已经忘记了她cowtube密码.然而,她记得一些有用的信息.首先,她记得她的密码(记为变 量P)长度为L(1 <= L<=1,000)字符串,并可 ...

  6. [BZOJ3609][Heoi2014]人人尽说江南好 结论题

    Description 小 Z 是一个不折不扣的 ZRP(Zealot Round-game Player,回合制游戏狂热玩家), 最近他 想起了小时候在江南玩过的一个游戏.     在过去,人们是要 ...

  7. js精度问题

    JavaScript数字精度丢失问题总结 现象 原因 计算机的二进制实现和位数限制有些数无法有限表示.就像一些无理数不能有限表示,如 圆周率 3.1415926...,1.3333... 等.JS 遵 ...

  8. C# WinCE项目 VS2008 单例窗体实现

    项目现有主界面FormMain,模板界面FormModel,其余5个子界面皆继承自模板. 现在想要实现在主界面下可以打开任意子界面,并且可以随时关闭.当打开的子窗体未执行Close事件时,要保证每次显 ...

  9. Planar Shadow

    Unity上平面阴影的计算与实现 //如何求顶点投影到平面上的点(阴影点) //当平面上取不相等的任意两个点组成一个向量,与平面的法线总是垂直的,向量垂直点乘为0,因此可以通过一个点和一个法线来定义, ...

  10. sudo: /etc/sudoers is world writable sudo: no valid sudoers sources found, q...

    今天操作/etc/sudoers 文件,因为该文件只读,所以sudo chmod 777 /etc/sudoers ,结果可以修改这个文件了,但是导致所有用户的sudo都不能用了 是因为在Linux中 ...