zk如何实现watch
在客户端发送命令:stat /zhang watch
在zk server中产生如下图的调用栈:
- //在DataTree类中有
- private final WatchManager dataWatches = new WatchManager();
- //在WatchManager类中有
- private final HashMap<String, HashSet<Watcher>> watchTable =
- new HashMap<String, HashSet<Watcher>>();
- private final HashMap<Watcher, HashSet<String>> watch2Paths =
- new HashMap<Watcher, HashSet<String>>();
我们详细分析addWatch代码:
- //path就是客户端命令中的"/zhang",而Watcher就是客户端的连接对象NIOServerCnxn
- //可以理解为客户端就是一个Watcher
- //public abstract class ServerCnxn implements Stats, Watcher
- //public class NIOServerCnxn extends ServerCnxn
- public synchronized void addWatch(String path, Watcher watcher) {
- //多个客户端关注一个path
- HashSet<Watcher> list = watchTable.get(path);
- if (list == null) {
- // don't waste memory if there are few watches on a node
- // rehash when the 4th entry is added, doubling size thereafter
- // seems like a good compromise
- list = new HashSet<Watcher>(4);
- watchTable.put(path, list);
- }
- list.add(watcher);
- //一个客户端关注多个path
- HashSet<String> paths = watch2Paths.get(watcher);
- if (paths == null) {
- // cnxns typically have many watches, so use default cap here
- paths = new HashSet<String>();
- watch2Paths.put(watcher, paths);
- }
- paths.add(path);
- }
在创建、删除、设置节点数据时,会触发watch:
- public Set<Watcher> triggerWatch(String path, EventType type, Set<Watcher> supress) {
- //生成事件
- WatchedEvent e = new WatchedEvent(type, KeeperState.SyncConnected, path);
- HashSet<Watcher> watchers;
- synchronized (this) {
- //删除关注path的客户端
- watchers = watchTable.remove(path);
- if (watchers == null || watchers.isEmpty()) {
- if (LOG.isTraceEnabled()) {
- ZooTrace.logTraceMessage(LOG,
- ZooTrace.EVENT_DELIVERY_TRACE_MASK,
- "No watchers for " + path);
- }
- return null;
- }
- for (Watcher w : watchers) {
- //删除该客户端关注的path
- HashSet<String> paths = watch2Paths.get(w);
- if (paths != null) {
- paths.remove(path);
- }
- }
- }
- for (Watcher w : watchers) {
- if (supress != null && supress.contains(w)) {
- continue;
- }
- //每个客户端处理watch事件
- //NIOServerCnxn.process(WatchedEvent event)
- w.process(e);
- }
- return watchers;
- }
zk如何实现watch的更多相关文章
- zk 起别名时候碰到的问题
第一次搭建时候都是用的ip,没什么问题,看到别人都是用的别名,于是也想试试把ip改成别名.然而 其中碰到的问题 ,快一周了才解决,现在记录下: 1.改主机别名 一直以为 修改 /etc/hosts 里 ...
- 基于ZK构建统一配置中心的方案和实践
背景: 近期使用Zk实现了一个简单的配置管理的小东西,在此开源出来,有兴趣的希望提出您的宝贵意见.如果恰巧您也使用或者接触过类似的东西, 也希望您可以分享下您觉得现在这个项目可以优化和改进的地方. 项 ...
- ZK 使用jfreeChart
前台: <?page title="Grid使用" contentType="text/html;charset=UTF-8"?> <zk x ...
- dubbo zk 分布式服务项目搭建与配置
1. 项目 jar -----提供接口 2. 项目 jar -----接口实现 provider启动zk main方法启动 start applicationContext.xml <b ...
- ZK 最少限度加载页面js文件
官方文档说明: ZK Developer's Reference文档,章节为Minimize Number of JavaScript Files to Load,按照文档步骤执行,最后需在 web. ...
- ZK textbox Constraint验证
test.zul: <?page title="" contentType="text/html;charset=UTF-8"?> <zk x ...
- ZK listbox 两种分页使用及比较
参考:http://tsinglongwu.iteye.com/blog/849923 以下代码模拟数据量大时情况,采用“<paging>”组件方式 前台Listbox.zul : < ...
- disconf系列【2】——解决zk部署情况为空的问题
如下图所示,在安装完成之后,发现zk(zookeeper)部署情况为空. 注:承接上篇,环境未发生改变. 1.解决zk没有启动的问题 查看disconf日志,发现zk没有启动. 实际情况是:zk已经启 ...
- zk系列-zookeeper的使用
zk支持java/c访问,java常用的有apache-zkclient.社区版的i0tec-zkclient.github.adyliu,apache-zkclient是zk自身提供的接口,i0te ...
- zk系列-zookeeper概述
接触zk是2年前了,最近工作又比较依赖于zk,所以准备起个系列文章,系统的总结下. zookeeper是一个分布式的用于协调的服务,起源于Hadoop中的一个组件.分布式系统可以用zookeeper实 ...
随机推荐
- 实验二 Java 面向对象程序设计
实验内容 1 初步掌握单元测试和TDD 2 理解并掌握面向对象三要素:封面,继承,多态 3 初步掌握UML建模 4 熟悉SOLID原则 5 了解设计模式 (一)单元测试 D
- 20165310_Exp2实验二《Java面向对象程序设计》
实验二<Java面向对象程序设计> TDD与单元测试 前期准备: 什么是单元测试? 单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证.对于单元测试中单元的含 ...
- 小工具:word表格文字转化成insert语句
群里的一个朋友有个需要,要让把word里的表格数据插入到数据库里面. 我的思路是,把格式化的数据转成insert语句,然后去执行就可以了. 要求的insert语句格式是:'insert into xx ...
- ubuntu下交叉编译imagemagick
环境:ubuntu16.04 交叉编译器版本号:4.8.3 在编译之前要编译以下其依赖的软件或库:freetype,libpng,libxml2,libtiff,libjpeg,zlib,graphv ...
- BZOJ3297: [USACO2011 Open]forgot DP+字符串
Description 发生了这么多,贝茜已经忘记了她cowtube密码.然而,她记得一些有用的信息.首先,她记得她的密码(记为变 量P)长度为L(1 <= L<=1,000)字符串,并可 ...
- [BZOJ3609][Heoi2014]人人尽说江南好 结论题
Description 小 Z 是一个不折不扣的 ZRP(Zealot Round-game Player,回合制游戏狂热玩家), 最近他 想起了小时候在江南玩过的一个游戏. 在过去,人们是要 ...
- js精度问题
JavaScript数字精度丢失问题总结 现象 原因 计算机的二进制实现和位数限制有些数无法有限表示.就像一些无理数不能有限表示,如 圆周率 3.1415926...,1.3333... 等.JS 遵 ...
- C# WinCE项目 VS2008 单例窗体实现
项目现有主界面FormMain,模板界面FormModel,其余5个子界面皆继承自模板. 现在想要实现在主界面下可以打开任意子界面,并且可以随时关闭.当打开的子窗体未执行Close事件时,要保证每次显 ...
- Planar Shadow
Unity上平面阴影的计算与实现 //如何求顶点投影到平面上的点(阴影点) //当平面上取不相等的任意两个点组成一个向量,与平面的法线总是垂直的,向量垂直点乘为0,因此可以通过一个点和一个法线来定义, ...
- sudo: /etc/sudoers is world writable sudo: no valid sudoers sources found, q...
今天操作/etc/sudoers 文件,因为该文件只读,所以sudo chmod 777 /etc/sudoers ,结果可以修改这个文件了,但是导致所有用户的sudo都不能用了 是因为在Linux中 ...