ZooKeeper Watcher事件监听机制

本文介绍了ZooKeeper的Watcher事件监听机制,包括服务端、客户端和客户端管理器的交互。客户端通过注册Watcher到服务端,当服务端检测到数据状态变化时,会通知客户端,触发对应的Watcher回调。讨论了不同连接状态下的通知,如正常连接、断开连接等。此外,还详细讲解了exists、getData和getChildren方法,用于检查节点、获取节点数据和子节点,并阐述了这些方法中Watcher的使用和事件响应。
摘要由CSDN通过智能技术生成

watcher架构

watcher实现由三个部分组成

  • zookeeper服务端
  • zookeeper客户端
  • 客户端的ZKWatchManager对象
    客户端首先将 Watcher注册到服务端,同时将 Watcher对象保存到客户端的watch管理器中。当Zookeeper服务端监听的数据状态发生变化时,服务端会主动通知客户端,接着客户端的 Watch管理器会**触发相关 Watcher**来回调相应处理逻辑,从而完成整体的数据 发布/订阅流程

在这里插入图片描述

特性说明
一次性watcher一次性的,一旦被触发就会移除,再次使用时需要重新注册
客户端顺序回调watcher回调是顺序串行执行的,只有回调后客户端才能看到最新的数据状态。一个watcher回调逻辑不应该太多,以免影响别的watcher执行
轻量级WatchEvent是最小的通信单位,结构上只包含通知状态、事件类型和节点路径,并不会告诉数据节点变化前后的具体内容
时效性watcher只有在当前session彻底失效时才会无效,若在session有效期内快速重连成功,则watcher依然存在,仍可接收到通知;

注册watcher

客户端与服务器的连接状态

  • KeeperState:通知状态
  • SyncConnected:客户端与服务器正常连接时
  • Disconnected:客户端与服务器断开连接时
  • Expired:会话session失效时
  • AuthFailed:身份认证失败时
  • 事件类型为:None
public static ZooKeeper genZkConn(){
        CountDownLatch count = new CountDownLatch(1);
        ZooKeeper zooKeeper = null;
        try {
            zooKeeper = new ZooKeeper("hadoop102:2181",5000,(WatchedEvent watchedEvent)->{
                if (watchedEvent.getState()== Watcher.Event.KeeperState.SyncConnected){
                    System.out.println("Zookeeper连接成功");
                    count.countDown();
                }
            });
        } catch (IOException e) {
            e.printStackTrace();
        }
        return zooKeeper;
    }

检查节点

exists方法

检查节点是否存在,第一个参数表示节点路径,第二个参数表示是否监听这个节点同一个节点可以注册多个监听器。

exists(String path, boolean b)
exists(String path, Watcher w)

getType()获取的值:

  • NodeCreated节点创建
  • NodeDeleted节点删除
  • NodeDataChanged节点内容
@Test
public void watcherExisted1() throws Exception{
    zooKeeper = ZooKeeperUtils.genZkConn();
    zooKeeper.exists("/watcher/node1",true);
    Thread.sleep(100000);
}

监测到节点被删除,但是Watcher是一次注册一次监测,监测完成后不能继续监测。

在这里插入图片描述

@Test
public void watcherExisted2() throws Exception{
    zooKeeper = ZooKeeperUtils.genZkConn();
    zooKeeper.exists("/watcher/node2", new Watcher() {
        @Override
        public void process(WatchedEvent event) {
            System.out.println("自定义Watcher");
            System.out.println("Path = " + event.getPath());
            System.out.println("EventType = "+event.getType());
            try {
                zooKeeper.exists("/watcher/node2",this);
            } catch (KeeperException e) {
                e.printStackTrace();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    });
    Thread.sleep(100000);
    }

precoss方法中再次调用watcher可以做到持续监测。

在这里插入图片描述


getData方法

getData(String path, boolean b, Stat stat)
getData(String path, Watcher w, Stat stat)

getType()获取的值:

  • NodeDeleted节点删除
  • NodeDataChange节点内容发生变化

getChildren方法

getChildren(String path, boolean b)
getChildren(String path, Watcher w)

getType()获取的值:

  • NodeChildrenChanged子节点发生变化
  • NodeDeleted节点删除
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值