在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接口的更多相关文章

  1. Zookeeper Watcher 解析

    1.Watcher 接口源码 1. 当客户端向zookeeper注册了watcher时,当服务器向客户端发送一个watcher事件通知时,客户端会调用回调方法process(WatchedEvent ...

  2. 8.7.ZooKeeper Watcher监听

    1.ZooKeeper Watcher ZooKeeper 提供了分布式数据发布/订阅功能,一个典型的发布/订阅模型系统定义了一种一对多的订阅关系,能让多个订阅者同时监听某一个主题对象, 当这个主题对 ...

  3. Zookeeper Watcher 流程分析(结合源码)

    概述 ZK提供了分布式数据的发布/订阅功能,一个典型的发布/订阅模型系统定义了一种一对多的订阅关系,能够让多个订阅者同时监听某个主题对象,当这个主题对象自身状态发生变化时,会通知所有的订阅者.在ZK中 ...

  4. Zookeeper——Watcher原理详解

    文章目录 引言 正文 一.如何注册监听 二.如何触发监听事件 三.事件类型有哪些 四.Watcher可以被无限次触发么?为什么要这么设计? 五.Watcher实现原理 1. 客服端发送请求 a. 初始 ...

  5. ZooKeeper Watcher 机制

    前言 在 ZooKeeper 中,客户端可以向服务端注册一个监听器,监听某个节点或者其子节点列表,当监听对象发生变化时,服务端就会向指定的客户端发送通知,这是 ZooKeeper 中的 Watcher ...

  6. zookeeper Watcher API 说明

    Watcher 在 ZooKeeper 是一个核心功能,Watcher 可以监控目录节点的数据变化以及子目录的变化,一旦这些状态发生变化,服务器就会通知所有设置在这个目录节点上的 Watcher,从而 ...

  7. zookeeper watcher

    ZooKeeper 的  watcher 机制主要包括客户端线程.客户端 WatchManager 和 ZooKeeper 服务器三部分. 工作方式:客户端在向 zk 服务器注册 Watcher 的同 ...

  8. ZooKeeper Watcher注意事项

    zookeeper watch的定义如下:watch事件是一次性触发器,当watch监视的数据发生变化时,通知设置了该watch的client,即watcher. 需要注意三点: 1.一次性触发器 c ...

  9. Zookeeper Watcher 机制 -- 数据变更通知 ?

    Zookeeper 允许客户端向服务端的某个 Znode 注册一个 Watcher 监听,当服务 端的一些指定事件触发了这个 Watcher,服务端会向指定客户端发送一个事件通 知来实现分布式的通知功 ...

随机推荐

  1. Geotools求shapefile路网中任意两点之间最短路径的距离

    前言:之前在博问求助过这个问题.经过几天的思考,算是解决了(但仍有不足),另一方面对Geotools不是很熟,有些描述可能不正确,希望大家批评指正. 问题:作为一个新手,我并没有发现Geotools中 ...

  2. 小白学 Python(23):Excel 基础操作(上)

    人生苦短,我选Python 前文传送门 小白学 Python(1):开篇 小白学 Python(2):基础数据类型(上) 小白学 Python(3):基础数据类型(下) 小白学 Python(4):变 ...

  3. Ubuntu18.04.3 LTS初体验

    安装系统 想来虚拟机安装太慢,正好有一台旧电脑,干脆整个乌班图系统. 启动盘工具:UltraISO,老牌工具了. 上官网下载ISO镜像文件: https://cn.ubuntu.com/downloa ...

  4. 本地yum配置

    yum yum(Yellow dog Updater, Modified)是一个在 Fedora 和 RedHat 以及 CentOS 中的 Shell 前端软件包管理器.基于 RPM 包管理,能够从 ...

  5. nyoj 27-水池数目(BFS, DFS)

    27-水池数目 内存限制:64MB 时间限制:3000ms Special Judge: No accepted:17 submit:22 题目描述: 南阳理工学院校园里有一些小河和一些湖泊,现在,我 ...

  6. 学习记录:《C++设计模式——李建忠主讲》4.“单一职责”模式

    单一职责模式:在软件组件的设计中,如果责任划分的不清晰,使用继承得到的结果往往是随着需求的变化,子类急剧膨胀,同时充斥着重复代码,这时候的关键是划清责任. 典型模式:装饰模式(Decorator).桥 ...

  7. 2019-9-19:渗透测试,HTML基础学习,html绘制表格

    1,受理员业务统计表 效果图: 代码: <!DOCTYPE html><html><head> <title>表格1</title>< ...

  8. css优先级之important

    css优先级之important

  9. 插入节点(appendChild())

    appendChild():方法将给元素节点追加一个子节点: reference = element.appendChild(newChild); 如上所示,给定节点newChild将成为给定元素节点 ...

  10. spring奇怪异常记录(会逐渐记录)

    1 严重: Context initialization failedorg.springframework.beans.factory.BeanCreationException: Error cr ...