Zookeeper Watcher接口
在ZooKeeper中,接口类Watcher用于表示一个标准的事件处理器,其定义了事件通知相关的逻辑,包含KeeperState和EventType两个枚举类,分别代表了通知状态和事件类型,同时定义了事件的回调方法:process(WatchedEvent event)。
什么是Watcher
同一个事件类型在不同的通知状态中代表的含义有所不同,表7-3列举了常见的通知状态和事件类型。
Watcher通知状态与事件类型一览
上图列举了ZooKeeper中最常见的几个通知状态和事件类型。
回调方法process()
process方法是Watcher接口中的一个回调方法,当ZooKeeper向客户端发送一个Watcher事件通知时,客户端就会对相应的process方法进行回调,从而实现对事件的处理。process方法的定义如下:
abstract public void process(WatchedEvent event);
这个回调方法的定义非常简单,我们重点看下方法的参数定义:WatchedEvent。
WatchedEvent包含了每一个事件的三个基本属性:通知状态(keeperState),事件类型(EventType)和节点路径(path),其数据结构如图7-5所示。ZooKeeper使用WatchedEvent对象来封装服务端事件并传递给Watcher,从而方便回调方法process对服务端事件进行处理。
提到WatchedEvent,不得不讲下WatcherEvent实体。笼统地讲,两者表示的是同一个事物,都是对一个服务端事件的封装。不同的是,WatchedEvent是一个逻辑事件,用于服务端和客户端程序执行过程中所需的逻辑对象,而WatcherEvent因为实现了序列化接口,因此可以用于网络传输。
服务端在生成WatchedEvent事件之后,会调用getWrapper方法将自己包装成一个可序列化的WatcherEvent事件,以便通过网络传输到客户端。客户端在接收到服务端的这个事件对象后,首先会将WatcherEvent还原成一个WatchedEvent事件,并传递给process方法处理,回调方法process根据入参就能够解析出完整的服务端事件了。
需要注意的一点是,无论是WatchedEvent还是WatcherEvent,其对ZooKeeper服务端事件的封装都是机及其简单的。举个例子来说,当/zk-book这个节点的数据发生变更时,服务端会发送给客户端一个“ZNode数据内容变更”事件,客户端只能够接收到信息。
Watcher案例
package com.zook.util; import org.apache.zookeeper.*;
import org.apache.zookeeper.data.Stat; import java.io.IOException; public class ZookeeperWatcher implements Watcher { //连接地址
private static final String CONNECT_ADDDR="0.0.0.0:2181"; //session超时时间
private static final int SESSION_OUTTIMF=; //创建zk方法
private ZooKeeper zk; private ZookeeperWatcher(){
openConnection(CONNECT_ADDDR,SESSION_OUTTIMF);
} @Override
public void process(WatchedEvent watchedEvent) {
//获取当前的状态
Event.KeeperState keeperState=watchedEvent.getState();
//获取通知类型
Event.EventType eventType=watchedEvent.getType();
//获取节点的路径
String path = watchedEvent.getPath();
System.out.println("当前的状态:"+keeperState+"\t通知乐行:"+eventType+"节点路径:"+path);
if (Event.KeeperState.SyncConnected==keeperState){
if (Event.EventType.None==eventType){
System.out.println("=================连接事件回调==================");
}
if (Event.EventType.NodeCreated==eventType){
System.out.println("=================创建事件回调==================");
}
if (Event.EventType.NodeDataChanged==eventType){
System.out.println("=================修改事件回调==================");
}
if (Event.EventType.NodeDeleted==eventType){
System.out.println("=================删除事件回调==================");
}
}
} /*连接zk方法*/
public void openConnection(String zk_address,int zk_session){
try {
zk=new ZooKeeper(zk_address,zk_session,this);
System.out.println("===============连接成功===============");
} catch (IOException e) {
e.printStackTrace();
}
} /*创建节点*/
public void createNode(String path,String data){
try {
//监听器
zk.exists(path,true);
String s = zk.create(path, data.getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
System.out.println("================创建成功===================");
} catch (KeeperException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
} /*修改节点*/
public void setNode(String path,String data){
try {
//监听器
zk.exists(path,true);
Stat stat = zk.setData(path, data.getBytes(), -);
System.out.println("===================修改成功======================");
} catch (KeeperException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
} /*删除节点*/
public void delNode(String path){
try {
//监听器
zk.exists(path,true);
zk.delete(path,-);
System.out.println("=====================删除成功过====================");
} catch (InterruptedException e) {
e.printStackTrace();
} catch (KeeperException e) {
e.printStackTrace();
}
} /*关闭连接*/
public void closeConnection(){
try {
zk.close();
} catch (InterruptedException e) {
e.printStackTrace();
}
} public static void main(String[] args){
ZookeeperWatcher zook=new ZookeeperWatcher();
//创建节点
//zook.createNode("/zk01","zkValue");
//修改节点
//zook.setNode("/zk01","zkValueSet");
//删除节点
zook.delNode("/zk01");
zook.closeConnection();
} }
Zookeeper Watcher接口的更多相关文章
- Zookeeper Watcher 解析
1.Watcher 接口源码 1. 当客户端向zookeeper注册了watcher时,当服务器向客户端发送一个watcher事件通知时,客户端会调用回调方法process(WatchedEvent ...
- 8.7.ZooKeeper Watcher监听
1.ZooKeeper Watcher ZooKeeper 提供了分布式数据发布/订阅功能,一个典型的发布/订阅模型系统定义了一种一对多的订阅关系,能让多个订阅者同时监听某一个主题对象, 当这个主题对 ...
- Zookeeper Watcher 流程分析(结合源码)
概述 ZK提供了分布式数据的发布/订阅功能,一个典型的发布/订阅模型系统定义了一种一对多的订阅关系,能够让多个订阅者同时监听某个主题对象,当这个主题对象自身状态发生变化时,会通知所有的订阅者.在ZK中 ...
- Zookeeper——Watcher原理详解
文章目录 引言 正文 一.如何注册监听 二.如何触发监听事件 三.事件类型有哪些 四.Watcher可以被无限次触发么?为什么要这么设计? 五.Watcher实现原理 1. 客服端发送请求 a. 初始 ...
- ZooKeeper Watcher 机制
前言 在 ZooKeeper 中,客户端可以向服务端注册一个监听器,监听某个节点或者其子节点列表,当监听对象发生变化时,服务端就会向指定的客户端发送通知,这是 ZooKeeper 中的 Watcher ...
- zookeeper Watcher API 说明
Watcher 在 ZooKeeper 是一个核心功能,Watcher 可以监控目录节点的数据变化以及子目录的变化,一旦这些状态发生变化,服务器就会通知所有设置在这个目录节点上的 Watcher,从而 ...
- zookeeper watcher
ZooKeeper 的 watcher 机制主要包括客户端线程.客户端 WatchManager 和 ZooKeeper 服务器三部分. 工作方式:客户端在向 zk 服务器注册 Watcher 的同 ...
- ZooKeeper Watcher注意事项
zookeeper watch的定义如下:watch事件是一次性触发器,当watch监视的数据发生变化时,通知设置了该watch的client,即watcher. 需要注意三点: 1.一次性触发器 c ...
- Zookeeper Watcher 机制 -- 数据变更通知 ?
Zookeeper 允许客户端向服务端的某个 Znode 注册一个 Watcher 监听,当服务 端的一些指定事件触发了这个 Watcher,服务端会向指定客户端发送一个事件通 知来实现分布式的通知功 ...
随机推荐
- RHEL7-Vsftpd匿名用户
实现:匿名用户创建目录,可以上传.下载文件,但是不可删除文件,禁止本地用户登陆. Vsftpd.conf部分参数 第一步:虚拟机挂载镜像 略 第二步:执行挂载命令 略 第三步:编写yum仓库文件 略 ...
- MySQL添加主键和外键
查看表的字段信息:desc 表名; 查看表的所有信息:show create table 表名; 添加主键约束:alter table 表名 add constraint 主键 (形如:PK_表名) ...
- Kickstart Round H 2019 Problem B. Diagonal Puzzle
有史以来打得最差的一次kickstart竟然发生在winter camp出结果前的最后一次ks = = 感觉自己的winter camp要凉了 究其原因,无非自己太眼高手低,好好做B, C的小数据,也 ...
- c#控制台玩飞行棋游戏
using System; namespace Game{ class Program { //用静态字段模拟全局变量 public static int[] Maps = new int[100]; ...
- 虚拟机和容器docker
云计算中最主要的技术就是虚拟机,开源虚拟机已经kvm已经集成到Linux内核!针对虚拟机浪费资源(CPU.内存.存储等)较大的缺陷,google力推Docker容器和容器管理平台Kubernetes. ...
- ACE框架 基于共享内存的分配器
ACE框架提供了一个内存分配器模板,并且提供了(仅且)一个模板实例,基于共存内存的内存分配器.这个共存内存分配器模板实例在ACE框架应用于,基于内存映射的进程通讯,以及进程间同步等. ACE内存分配器 ...
- objc里的伪指针TaggedPointer
如果你看过我前面两篇objc函数枢纽msgSend和你印象中的NSString是这样吗,相信已经多次看过它的身影了,到底它是何物何作用,我今日就来揭开谜团.我之所为称呼它为伪指针,是因为它像幽灵一样, ...
- 标准库flag和cobra
package main import "flag" var b bool var q *bool func init(){ var b bool //方式一 flag.Type( ...
- LXC容器文件系统设计优化
在HOST上面,一个LXC container包含一个config文件和一个rootfs目录. 早期我们在交叉编译系统上编译出container的rootfs之后,直接在编译系统上将其用tar压缩打包 ...
- 一篇文章搞定Python多进程(全)
1.Python多进程模块 Python中的多进程是通过multiprocessing包来实现的,和多线程的threading.Thread差不多,它可以利用multiprocessing.Proce ...