首页 > 其他分享 >ZooKeeper系列:zk中的watch

ZooKeeper系列:zk中的watch

时间:2022-10-12 11:06:00浏览次数:48  
标签:case name zk ZooKeeper watch break getData

Watch就是监听,观察。 其实就是客户端注册watch,然后服务端发生节点数据变化的时候会触发watch事件,接着回调客户端 创建工程和实现类 创建java 的maven工程,然后在pom中添加对应的zookeeper的maven信息,其版本需要和安装的zookeeper版本一致

<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.8.0</version>
</dependency>

与zookeeper集群建立连接,其中使用了三个参数:

connectString: 连接地址, 集群中各个节点的地址和端口,使用逗号隔开。 sessionTimeout: 超时时间,session的超时 watcher: 监听,在session中注册监听,此 watcher是session级别的

连接配置以及watch相关的使用参考下面的代码

public static void main(String[] args) throws IOException, KeeperException, InterruptedException {
CountDownLatch countDownLatch = new CountDownLatch(1);
ZooKeeper zk = new ZooKeeper("127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183", 3000, new Watcher() {
@Override
public void process(WatchedEvent watchedEvent) {
Event.KeeperState state = watchedEvent.getState();
System.out.println(watchedEvent.toString());

switch (state) {
case Unknown:
break;
case Disconnected:
break;
case NoSyncConnected:
break;
case SyncConnected:
System.out.println("连接成功:connected");
countDownLatch.countDown();
break;
case AuthFailed:
break;
case ConnectedReadOnly:
break;
case SaslAuthenticated:
break;
case Expired:
break;
case Closed:
break;
}
}
});

try {
countDownLatch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
ZooKeeper.States states = zk.getState();

switch (states) {
case CONNECTING:
System.out.println("CONNECTING......");
break;
case ASSOCIATING:
break;
case CONNECTED:
System.out.println("CONNECTED......");
break;
case CONNECTEDREADONLY:
break;
case CLOSED:
break;
case AUTH_FAILED:
break;
case NOT_CONNECTED:
break;
}

zk.create("/name","纪先生".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
Stat stat = new Stat();
zk.getData("/name", new Watcher() {
@Override
public void process(WatchedEvent watchedEvent) {
System.out.println("getData watch..."+ watchedEvent.toString());
try {
zk.getData("/name",true,stat);
// zk.getData("/name",this,stat);
} catch (KeeperException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},stat);
Stat stat1 = zk.setData("/name","无先生".getBytes(),0);
zk.setData("/name","有先生".getBytes(),stat1.getVersion());

}

总共有两种watch: 第一类:new Zookeeper时候传入的watch,此watch是session级别的,跟path,node没关系 第二类:getData的时候传入的watch,此watch是和path,node相关的,当path发生变化的时候会触发watch。 watch的特点:

watch的注册只发生在读类型的调用,如getData,exists,getChildren watch的注册是一次性的,如果想每次操作都有回调,需要每次读操作都要注册一次

例如: 注册watch除了直接new watch之外,还有下面两种简单的方式 方式一:代码中的zk.getData("/name",true,stat),其中的true参数就是代表注册进去的watch是default watch,即new zk的那个watch。 方式二:zk.getData("/name",this,stat);,这里的this代表的是父级的watch,就是它外层注册的watch。

zk.getData("/name", new Watcher() {
@Override
public void process(WatchedEvent watchedEvent) {
System.out.println("getData watch..."+ watchedEvent.toString());
try {
zk.getData("/name",true,stat);
} catch (KeeperException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},stat);

如果不在watch中添加一个zk.getData("/name",true,stat),那么只有在第一次setData的时候会触发设置的watch,第二次setData的时候则不会(watch 是一次性的) 为什么会使用CountDownLatch 仔细点话会发现代码中增加countDownLatch,这个是为了检测zk创建成功之后才会返回连接成功(CONNECTED),zk的启动是异步的,new之后立即获取zk的状态是CONNECTING的,无法正常使用。

标签:case,name,zk,ZooKeeper,watch,break,getData
From: https://blog.51cto.com/u_15773567/5749137

相关文章

  • ZooKeeper
    ZooKeeper作为顶级分布式开源项目,应用非常广泛,Dubbo和Kafka这些知名的开源项目都在使用。之前只是听说过它,并没有仔细研究过。今天带大家来学习下ZooKeeper,主要从ZooKeeper......
  • Dubbo学习(一)- windows下安装zookeeper
    下载zookeeper下载地址:​​https://www.apache.org/dyn/closer.cgi/zookeeper/​​下载下来zookeeper-3.4.11.tar.gz,解压到当前文件夹修改配置找到zookeeper-3.4.11\conf\zo......
  • zookeeper集群的概念
    zookeeper集群属于一个复制集群,服务端由一个leader和三个follower组成,主负责读写,follower负责读zookeeper集群有两种状态,有主状态和无主状态,当处于无主状态的时候,zookeepe......
  • zookeeper的几种授权方式
    zookeeper授权方式设置一、设置授权1.1、IP白名单方式备注:对需要进行白名单设置的路径进行设置,此处设置的路径没有继承关系,即设置了/test的白名单,但是/test/test2依然......
  • 【dp优化】股票交易 玩具装箱 Watching Fireworks is Fun
    P5017NOIP2018普及组摆渡车点击查看代码#include<stdio.h>//做法:设f[i]为时刻i的最小等待时间#include<string.h>//f[i]=min{f[j]+i(cnt[i]-cnt[j])-(sum[i]-......
  • zookeeper下载安装(base)
    1,获取,Apache官网下载 http://zookeeper.apache.org/releases.html我下载下来的,放在网盘上了地址: http://pan.baidu.com/s/1bnm21Jp2,解压出来 tarxvf zookeeper-3.4.......
  • 5 分钟完成 ZooKeeper 数据迁移
    作者:草谷前言MSE提供了托管版的ZooKeeper,包含比开源ZooKeeper更强大更稳定的功能,能帮助您免去运维ZooKeeper集群的烦恼,当我们需要从自建ZooKeeper迁移到MSEZooKee......
  • 5 分钟完成 ZooKeeper 数据迁移
    作者:草谷前言MSE提供了托管版的ZooKeeper,包含比开源ZooKeeper更强大更稳定的功能,能帮助您免去运维ZooKeeper集群的烦恼,当我们需要从自建ZooKeeper迁移到MSEZoo......
  • vue2双向绑定原理:深入响应式原理defineProperty、watcher、get、set
    响应式是什么?Vue最独特的特性之一~就是我们在页面开发时,修改data值的时候,数据、视图页面需要变化的地方变化。主要使用到哪些方法?用 Object.defineProperty给watcher对......
  • 【图解源码】Zookeeper3.7源码剖析,Session的管理机制,Leader选举投票规则,集群数据同步
    Zookeeper3.7源码剖析能力目标掌握Zookeeper中Session的管理机制能基于Client进行Debug测试Session创建/刷新操作能搭建Zookeeper集群源码配置掌握集群环境下Leader选举启动......