原生的zookeeper的监听API所实现的方法存在一些缺点,对于开发者来说后续的开发会考虑的细节比较多。

Curator所实现的方法希望摒弃原声API 的不足,是开发看起来更加的简单,一些重连等操作对开发者变成了透明操作,而不需要去考虑。

1. Curator的监听API

Curator的监听实现是对zookeeper原生监听方法的高级封装,主要体现在两点:监听重复注册,事件发生信息。而且监听事件返回详细的信息,如变动的节点信息,节点的value等。

Curator 提供了3个接口,包含在org.apache.curator.framework.recipes.cache下(点击超链接可查看对应的javadoc)

如图所示:

1) NodeCache: 对一个节点进行监听,监听事件包括指定的路径节点的增、删、改的操作。

2) PathChildrenCache: 对指定的路径节点的一级子目录进行监听,不对该节点的操作进行监听,对其子目录的节点进行增、删、改的操作监听

3) TreeCache:  可以将指定的路径节点作为根节点(祖先节点),对其所有的子节点操作进行监听,呈现树形目录的监听,可以设置监听深度,最大监听深度为2147483647(int类型的最大值)。

2. NodeCache

Node Cache - A utility that attempts to keep the data from a node locally cached. This class will watch the node, respond to update/create/delete events, pull down the data, etc. You can register a listener that will get notified when changes occur. (官网)

部分样例代码

NodeCache nodeCache = null;

nodeCache.start(true);
  // 如果为true则首次不会缓存节点内容到cache中,默认为false,设置为true首次不会触发监听事件

nodeCache.getListenable().addListener(new NodeCacheListener(){

            @Override
public void nodeChanged() throws Exception {
// 节点发生变化,回调方法
byte[] ret = nodeCache.getCurrentData().getData();
// getData()方法实现返回byte[]
System.out.println("数据发生变化: " + new String(ret));
} });

说明:

       /*
* 节点路径不存在,set不触发监听
* 节点路径不存在,创建事件触发监听(第一次创建时要触发)
* 节点路径存在,set触发监听(改操作触发)
* 节点路径存在,delete触发监听(删操作触发)
*
* 节点挂掉,未触发任何监听
* 节点重连,未触发任何监听
* 节点重连 ,恢复监听
* */

2. PathChildrenCache

Path Cache - A Path Cache is used to watch a ZNode. Whenever a child is added, updated or removed, the Path Cache will change its state to contain the current set of children, the children's data and the children's state. Path caches in the Curator Framework are provided by the PathChildrenCache class. Changes to the path are passed to registered PathChildrenCacheListener instances.(官网)

部分样例代码:

PathChildrenCache pathChildrenCache = null;

pathChildrenCache.start(PathChildrenCache.StartMode.BUILD_INITIAL_CACHE);
pathChildrenCache.getListenable().addListener(new PathChildrenCacheListener(){ @Override
public void childEvent(CuratorFramework client,
PathChildrenCacheEvent event) throws Exception {
//
switch(event.getType()) {
case CHILD_ADDED:
System.out.println("添加了儿子节点 " + event.getData());
break;
case CHILD_UPDATED:
System.out.println("儿子节点发生了更新 " + event.getData());
break;
case CHILD_REMOVED:
System.out.println("儿子节点移除 " + event.getData());
case CONNECTION_SUSPENDED: break;
// ZK挂掉
case CONNECTION_RECONNECTED: break;
// 重新启动ZK
case CONNECTION_LOST: break;
// ZK挂掉一段时间后
case INITIALIZED: break;
default: break;
}
} });

说明:

        /**
* 注册监听器,当前节点不存在,创建该节点:未抛出异常及错误日志
* 注册子节点触发type=[CHILD_ADDED]
* 更新触发type=[CHILD_UPDATED]
*
* zk挂掉type=CONNECTION_SUSPENDED,,一段时间后type=CONNECTION_LOST
* 重启zk:type=CONNECTION_RECONNECTED, data=null
* 更新子节点:type=CHILD_UPDATED, data=ChildData{path='/zktest111/tt1', stat=4294979983,4294979993,1501037475236,1501037733805,2,0,0,0,6,0,4294979983
,data=[55, 55, 55, 55, 55, 55]}

* 删除子节点type=CHILD_REMOVED
* 更新根节点:不触发
* 删除根节点:不触发 无异常
* 创建根节点:不触发
* 再创建及更新子节点不触发
*
* 重启时,与zk连接失败
*/

3. TreeCache

Tree Cache - A utility that attempts to keep all data from all children of a ZK path locally cached. This class will watch the ZK path, respond to update/create/delete events, pull down the data, etc. You can register a listener that will get notified when changes occur.(官网)

部分样例代码:

TreeCache treeCache = null;

treeCache.start();
// 没有开启模式作为入参的方法 treeCache.getListenable().addListener(new TreeCacheListener(){ @Override
public void childEvent(CuratorFramework client, TreeCacheEvent event)
throws Exception {
//
switch(event.getType()) {
case NODE_ADDED:
System.out.println("tree:发生节点添加" + event.getData().toString() ); break;
case NODE_UPDATED:
System.out.println("tree:发生节点更新"); break;
case NODE_REMOVED:
System.out.println("tree:发生节点删除"); break;
case CONNECTION_SUSPENDED:
break;
case CONNECTION_RECONNECTED:
break;
case CONNECTION_LOST:
break;
case INITIALIZED:
System.out.println("初始化的操作"); break;
default:
break;
}
} });

说明:

        /**
* TreeCache.nodeState == LIVE的时候,才能执行getCurrentChildren非空,默认为PENDING
* 初始化完成之后,监听节点操作时 TreeCache.nodeState == LIVE
*
* maxDepth值设置说明,比如当前监听节点/t1,目录最深为/t1/t2/t3/t4,则maxDepth=3,说明下面3级子目录全
* 监听,即监听到t4,如果为2,则监听到t3,对t3的子节点操作不再触发
* maxDepth最大值2147483647
*
* 初次开启监听器会把当前节点及所有子目录节点,触发[type=NODE_ADDED]事件添加所有节点(小等于maxDepth目录)
* 默认监听深度至最低层
* 初始化以[type=INITIALIZED]结束
*
* [type=NODE_UPDATED],set更新节点值操作,范围[当前节点,maxDepth目录节点](闭区间)
*
*
* [type=NODE_ADDED] 增加节点 范围[当前节点,maxDepth目录节点](左闭右闭区间)
*
* [type=NODE_REMOVED] 删除节点, 范围[当前节点, maxDepth目录节点](闭区间),删除当前节点无异常
*
* 事件信息
* TreeCacheEvent{type=NODE_ADDED, data=ChildData{path='/zktest1', stat=4294979373,4294979373,1499850881635,1499850881635,0,0,0,0,2,0,4294979373
, data=[116, 49]}}
*
*/

Curator的监听机制的更多相关文章

  1. 8、Curator的监听机制

    原生的zookeeper的监听API所实现的方法存在一些缺点,对于开发者来说后续的开发会考虑的细节比较多. Curator所实现的方法希望摒弃原声API 的不足,是开发看起来更加的简单,一些重连等操作 ...

  2. Zookeeper Curator 事件监听 - 秒懂

    目录 写在前面 1.1. Curator 事件监听 1.1.1. Watcher 标准的事件处理器 1.1.2. NodeCache 节点缓存的监听 1.1.3. PathChildrenCache ...

  3. 4.JAVA之GUI编程事件监听机制

    事件监听机制的特点: 1.事件源 2.事件 3.监听器 4.事件处理 事件源:就是awt包或者swing包中的那些图形用户界面组件.(如:按钮) 事件:每一个事件源都有自己特点有的对应事件和共性事件. ...

  4. .NET事件监听机制的局限与扩展

    .NET中把“事件”看作一个基本的编程概念,并提供了非常优美的语法支持,对比如下C#和Java代码可以看出两种语言设计思想之间的差异. // C#someButton.Click += OnSomeB ...

  5. java 24 - 2 GUI之监听机制和适配器改进窗口关闭

    我们创建了窗体后,就要对窗体进行操作,比如关闭窗口.而这时候就要建立监听机制: 事件监听机制: A:事件源 事件发生的地方 B:事件 就是要发生的事情 C:事件处理 就是针对发生的事情做出的处理方案 ...

  6. 关于JAVA中事件分发和监听机制实现的代码实例-绝对原创实用

    http://blog.csdn.net/5iasp/article/details/37054171 文章标题:关于JAVA中事件分发和监听机制实现的代码实例 文章地址: http://blog.c ...

  7. 关于事件监听机制的总结(Listener和Adapter)

    记得以前看过事件监听机制背后也是有一种设计模式的.(设计模式的名字记不清了,只记得背后实现的数据结构是数组.) 附上事件监听机制的分析图: 一个事件源可以承载多个事件(只要这个事件源支持这个事件就可以 ...

  8. GUI编程笔记(java)05:GUI事件监听机制原理和举例说明

    1.事件监听机制:       A:事件源          事件发生的地方       B:事件             就是要发生的事情       C:事件处理       就是针对发生的事情做 ...

  9. JAVA事件监听机制学习

    //事件监听机制 import java.awt.*; import java.awt.event.*; public class TestEvent { public static void mai ...

随机推荐

  1. Ad Hoc Distributed Queries组件

    http://www.cnblogs.com/870060760JR/p/6016080.html SQL Server 阻止了对组件“Ad Hoc Distributed Queries”的 STA ...

  2. 高性能javascript 文件加载阻塞

    高性能javascript   javascript脚本执行过程中会中断页面加载,直到脚本执行完毕,此操作阻塞了页面加载,造成性能问题. 脚本位置和加载顺序:如果将脚本放在head内,那么再脚本执行完 ...

  3. java was started but returned exit code=1

    将eclipse.ini文件删掉, 重启eclipse 会自动生成一个eclipse.ini就可以了~

  4. fis3 静态文件 发布 线上

    PMS上线及安装文档 目录 一:安装环境1 1.1安装Node和NPM 1 1.2安装FIS3 1 1.3安装fis3压缩包 1 二:上线更新2 1:发布网站 2 2:寻找fis3 文件 2 3:复制 ...

  5. 【BZOJ3439】Kpm的MC密码 Trie树+可持久化线段树

    [BZOJ3439]Kpm的MC密码 Description 背景 想Kpm当年为了防止别人随便进入他的MC,给他的PC设了各种奇怪的密码和验证问题(不要问我他是怎么设的...),于是乎,他现在理所当 ...

  6. dot 使用笔记

    Graphviz (英文:Graph Visualization Software的缩写)是一个由AT&T实验室启动的开源工具包,用于绘制DOT语言脚本描述的图形 sudo apt-get i ...

  7. 页面的日志服务 web页面渲染 服务 ; 服务耦合带来的问题

    情景: 虽然对web服务做了3节点的负载均衡,但是由于埋点数据的落盘的代码也在相同服务器上,导致当flume处理日志的吞吐量达到瓶颈时,3节点的请求积压,挤占服务器资源,导致接口数据处理迟缓,页面加载 ...

  8. 第13章—数据库连接池(Druid)

    spring boot 系列学习记录:http://www.cnblogs.com/jinxiaohang/p/8111057.html 码云源码地址:https://gitee.com/jinxia ...

  9. jquery获取浏览器类型和版本号的方法

    $(document).ready(function(){ varbrow=$.browser; varbInfo=""; if(brow.msie){bInfo="Mi ...

  10. 解决跨域HttpResponseJsonCORS, HttpResponseCORS 返回字典数据

    #!/usr/bin/python # -*- coding: UTF-8 -*- import json from django.http import HttpResponse def HttpR ...