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实 ...
随机推荐
- P4878 [USACO05DEC]layout布局
P4878 [USACO05DEC]layout布局 差分约束 最短路径最长路,最长路径最短路 本题求的是最长路径,所以跑最短路 根据题意连边,然后spfa即可 注意要判断图的连通性,所以新建一个虚拟 ...
- 20145122 《Java程序设计》第8周学习总结
教材学习内容总结 1.NIO使用频道(channel)来衔接数据节点,对数据区的标记提供了clear(),rewind(),flip(),compact()等高级操作. 2.想要取得channel的操 ...
- Spark On YARN 分布式集群安装
一.导读 最近开始学习大数据分析,说到大数据分析,就必须提到Hadoop与Spark.要研究大数据分析,就必须安装这两个软件,特此记录一下安装过程.Hadoop使用V2版本,Hadoop有单机.伪分布 ...
- Log4j将不同Package的日志输出到不同的文件的方法
随着项目规模的越来越大,会不断的引入新的模块,不同的模块都会打印自己的日志,最后就造成日志根本没法查看,比如我自己的项目中,就存在以下这些日志: 接收外界消息的日志.对外发送消息的日志: 后台常驻线程 ...
- C# 图片和64位编码的转换
/* 将图片转换为64位编码 */ //找到文件夹 System.IO.DirectoryInfo dd = new System.IO.DirectoryInfo("C://qq" ...
- AndroidStudio V2.0.0.汉化
汉化包下载:http://pan.baidu.com/s/1kVKYUjH AndroidStudio V2.0.x.版汉化工作介绍 resource_en.jar------> resourc ...
- JavaScript:Object属性方法
Object的属性(firebug中没有找到) var pro={ city:"shanghai", list:[,,,,] } var Person=function(name, ...
- Spring Boot条件注解
一.为什么SpringBoot产生于Spring4? Spring4中增加了@Condition annotation, 使用该Annotation之后,在做依赖注入的时候,会检测是否满足某个条件来决 ...
- 【maven】在IDEA上 使用maven进行打包时报错:Failed to execute goal org.apache.maven.plugins:maven-javadoc-plugin:2.10.3:jar
报错内容如下: [INFO] ------------------------------------------------------------------------ [INFO] BUILD ...
- gulp报错插件gulp-notify 配置项
var notify = require("gulp-notify"); module.exports = function(){ var args = Array.prototy ...