ZooKeerper学习之Watcher
ZooKeeper为我们提供了用于监视结点变化的Watcher机方法制:
1、可以注册Watcher的方法:getData()、exists()、getChildren()。我们可以通过查看ZooKeeper API看到
getData方法:
void getData(String path, boolean watch, AsyncCallback.DataCallback cb, Object ctx)
byte[] getData(String path, boolean watch, Stat stat)
void getData(String path, Watcher watcher, AsyncCallback.DataCallback cb, Object ctx)
byte[] getData(String path, Watcher watcher, Stat stat)
exists方法:
Stat exists(String path, boolean watch)
Return the stat of the node of the given path.
void exists(String path, boolean watch, AsyncCallback.StatCallback cb, Object ctx)
The Asynchronous version of exists.
Stat exists(String path, Watcher watcher)
Return the stat of the node of the given path.
void exists(String path, Watcher watcher, AsyncCallback.StatCallback cb, Object ctx)
The Asynchronous version of exists.
getChildren方法:
List<String> getChildren(String path, boolean watch)
Return the list of the children of the node of the given path.
void getChildren(String path, boolean watch, AsyncCallback.Children2Callback cb, Object ctx)
The Asynchronous version of getChildren.
void getChildren(String path, boolean watch, AsyncCallback.ChildrenCallback cb, Object ctx)
The Asynchronous version of getChildren.
List<String> getChildren(String path, boolean watch, Stat stat)
For the given znode path return the stat and children list.
List<String> getChildren(String path, Watcher watcher)
Return the list of the children of the node of the given path.
void getChildren(String path, Watcher watcher, AsyncCallback.Children2Callback cb, Object ctx)
The Asynchronous version of getChildren.
void getChildren(String path, Watcher watcher, AsyncCallback.ChildrenCallback cb, Object ctx)
The Asynchronous version of getChildren.
List<String> getChildren(String path, Watcher watcher, Stat stat)
For the given znode path return the stat and children list.
2、可以触发Watcher的方法有:create()、delete()、setData()。通过查看API:
create方法:
String create(String path, byte[] data, List<ACL> acl, CreateMode createMode)
Create a node with the given path.
void create(String path, byte[] data, List<ACL> acl, CreateMode createMode, AsyncCallback.StringCallback cb, Object ctx)
The Asynchronous version of create.
delete方法:
void delete(String path, int version)
Delete the node with the given path.
void delete(String path, int version, AsyncCallback.VoidCallback cb, Object ctx)
The Asynchronous version of delete.
setData方法:
Stat setData(String path, byte[] data, int version)
Set the data for the node of the given path if such a node exists and the given version matches the version of the node (if the given version is -1, it matches any node's versions).
void setData(String path, byte[] data, int version, AsyncCallback.StatCallback cb, Object ctx)
The Asynchronous version of setData.
3、一个Watcher实例是一个回调函数,被调用一次以后就会被移除,如果还需观察结点数据的变化,则还需再次注册Watcher。
4、当我们New ZooKeeper时,注册的Watcher被称为default Watcher,它不是一次性的,只会对client的连接状态变化做出反应。当发生CONNECTIONLOSS之后,只要在session_timeout时间之内能够再次连上(即不发生SESSION_EXPIRED),那么这个连接注册的watcher依然有效。
5、同一个客户端,对某一个节点注册了多次watcher,那么只会收到一次通知。
6、一些操作对应的事件类型:
|
Event for "/path" |
Event for "/path/child" |
|
|
Create("/path",...) |
EventType.NodeCreated |
/ |
|
Delete("/path",...) |
EventType.Deleted |
/ |
|
setData("/path") |
EventType.NodeDataChanged |
/ |
|
Create("/path/child") |
EventType.NodeChildrenChanged |
EventType.NodeCreated |
|
Delete("/path/child") |
EventType.NodeChildrenChanged |
EventType.NodeDeleted |
|
setData("/path/child") |
/ |
EventType.NodeDataChanged |
7、事件类型与Watcher的对应关系:
|
event for "/path" |
Default watcher |
Exists("/path") |
getData("/path") |
getChildren("/path") |
|
EventType.None |
√ |
√ |
√ |
√ |
|
EventType.NodeCreated |
√ |
√ |
||
|
EventType.NodeDeleted |
√ |
√ |
||
|
EventType.NodeDataChanged |
√ |
√ |
||
|
EventType.NodeChildrenChanged |
√ |
一个小例子:
package org.apache.zookeeper.test; import java.io.IOException; import org.apache.log4j.PropertyConfigurator;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.ZooKeeper; public class Demo { public static void main(String[] args) throws IOException, KeeperException, InterruptedException { // 创建一个与服务器的连接
ZooKeeper zk = new ZooKeeper("192.168.11.201:2181", 6000, new Watcher() {
// 监控所有被触发的事件
/**
* EventType:
* None
* NodeCreated
* NodeChildrenChanged
* NodeDataChanged
* NodeDeleted
*/
public void process(WatchedEvent event) {
System.out.println("EVENT:" + event.getType());
}
}); // 查看根节点
System.out.println("ls / => " + zk.getChildren("/", true)); // 创建一个目录节点
if (zk.exists("/node", true) == null) {
zk.create("/node", "this is a znode".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
System.out.println("create /node this is a znode");
// 查看/node节点数据
System.out.println("get /node => " + new String(zk.getData("/node", false, null)));
// 查看根节点
System.out.println("ls / => " + zk.getChildren("/", true));
} // 创建一个子目录节点
if (zk.exists("/node/app1", true) == null) {
zk.create("/node/app1", "this is app1".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
System.out.println("create /node/app1 app1");
// 查看node节点
System.out.println("ls /node => " + zk.getChildren("/node", true));
} // 修改节点数据
if (zk.exists("/node", true) != null) {
zk.setData("/node", "the data is changed".getBytes(), -1);
// 查看/node节点数据
System.out.println("get /node => " + new String(zk.getData("/node", false, null)));
} // 删除节点
if (zk.exists("/node/app1", true) != null) {
zk.delete("/node/app1", -1);
zk.delete("/node", -1);
// 查看根节点
System.out.println("ls / => " + zk.getChildren("/", true));
} // 关闭连接
zk.close();
}
}
ZooKeerper学习之Watcher的更多相关文章
- vue.js 源代码学习笔记 ----- $watcher
/* @flow */ import { queueWatcher } from './scheduler' import Dep, { pushTarget, popTarget } from '. ...
- Zookeeper学习之Watcher事件类型和ZK状态
1.Zookeepe Watcherr的事件类型和ZK状态. zookeeper:Watcher.ZK状态,事件类型(一)zookeeper有watch事件,是一次性触发的,当watch监视的数据发 ...
- Zookeeper 系列(三)Zookeeper API
Zookeeper 系列(三)Zookeeper API 本节首先介绍 Zookeeper 的 Shell 命令,再对 Java 操作 Zookeeper 的三种方式进行讲解,本节先介绍 Zookee ...
- zookeeper原理与实践(一)----zookeeper的基本功能
我们现在围绕两个问题来学习zookeeper: 什么是zookeeper? zookeeper基础知识 什么是zookeeper: zookeeper是hadoop下面的一个子项目,是一个分布式协调服 ...
- 轻松学习Ionic (三) 安装sass并在webstorm中为scss添加watcher
1. 安装Ruby 最新为 2.1.5版本,不放心的话安装 Ruby 1.9.3-p551 安装过程中注意勾选上第二项!即将Ruby加入到可执行的环境变量中去. 安装结束后在命令行中 ...
- kafka学习笔记:知识点整理
一.为什么需要消息系统 1.解耦: 允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束. 2.冗余: 消息队列把数据进行持久化直到它们已经被完全处理,通过这一方式规避了数据丢失风险. ...
- ElasticSearch 5学习(1)——安装Elasticsearch、Kibana和X-Pack
安装准备: 安装Elasticsearch唯一的要求是安装官方新版的Java,包括对应的Jdk. 安装Elasticsearch 首先到官网下载最新版本的Elasticsearch压缩包. 可以使用命 ...
- vue学习笔记
来公司以后就一直在用vue框架,不管是业务代码,还是做vue组件.关于vue有一些点是文档中没有提及的,记录一下以便以后查询- 一.Vue的特点 新一代 Vue.js 框架非常关注如何用极少的外部特性 ...
- hadoop学习笔记:zookeeper学习(上)
在前面的文章里我多次提到zookeeper对于分布式系统开发的重要性,因此对zookeeper的学习是非常必要的.本篇博文主要是讲解zookeeper的安装和zookeeper的一些基本的应用,同时我 ...
随机推荐
- Linux启动界面切换:图形界面-字符界面(转)
Linux字符界面切换到图形界面 由字符界面切换到图形界面可用两种简单方法实现: 1.在字符界面输入startx或init 5 . 2.通过编辑/etc/inittab文件实现默认进入图形界面. 把其 ...
- Bubble Cup 8 finals I. Robots protection (575I)
题意: 有一个正方形区域, 要求支持两个操作: 1.放置三角形,给定放置方向(有4个方向,直角边与坐标轴平行),直角顶点坐标,边长 2.查询一个点被覆盖了多少次 1<=正方形区域边长n<= ...
- 为什么现在更多需要用的是 GPU 而不是 CPU,比如挖矿甚至破解密码?
作者:Cascade链接:https://www.zhihu.com/question/21231074/answer/20701124来源:知乎著作权归作者所有,转载请联系作者获得授权. 想要理解G ...
- 移动端开发概览【webview和touch事件】
作为一个前端,而且作为一个做移动端开发的前端,那意味着你要有三头六臂,跟iOS开发哥哥一起打酱油,跟Android开发哥哥一起修bug... Android vs Ios 我在webkit内核的chr ...
- 在Unity中使用UGUI修改Mesh绘制几何图形
在商店看到这样一个例子,表示很有兴趣,他们说是用UGUI做的.我想,像这种可以随便变形的图形,我第一个就想到了网格变形. 做法1: 细心的朋友应该会发现,每个UGUI可见元素,都有一个‘Canvas ...
- xml中处理大于小与符号
原符号 < <= > >= & ' " 替换符号 < <= > >= & ...
- 利用Java代码在某些时刻创建Spring上下文
上一篇中,描述了如何使用Spring隐式的创建bean,但当我们需要引进第三方类库添加到我们的逻辑上时,@Conponent与@Autowired是无法添加到类上的,这时,自动装配便不适用了,我们需要 ...
- A()方法
A方法用于在内部实例化控制器,调用格式:A('[项目://][分组/]模块','控制器层名称')最简单的用法: $User = A('User'); 复制代码 表示实例化当前项目的UserActi ...
- JS学习:第二周——NO.1回调函数
[回调函数] 定义:把一个函数的定义阶段,作为参数,传给另一个函数: 回调函数调用次数,取决于条件: 回调函数可以传参: 回调函数可以给变this指向,默认是window: 回调函数没有返回值,for ...
- JavaScript学习笔记(1))——————call,apply方法
学习前端也有一段时间了,但是效果甚微.利用时间不够充分,虽然是利用工作之余来学习.但是这不能成为我的借口. 今天学习了(其实看了很多遍)call apply方法. function abc(a,b){ ...