文档章节

zookeeper学习之zkclient事件监听<十>

woshixin
 woshixin
发布于 2017/09/08 22:32
字数 644
阅读 486
收藏 0

在前面说的原来的zk的java api中,提供了watcher的机智监听节点,zkclient将之转换成Listener的概念,就是订阅服务端的事件。

下面一个小程序,简单验证一下节点的监听

日志输出: 一目了然

来看看注册的监听,IZkChildListener,这个接口一个方法handleChildChange,两个参数

parentPath:节点变动的通知父节点路径

currentChilds:子节点路径们

其实一个节点不存在也是可以先设置监听的,只是这边zk-xin已经存在了,所以没写而已

而且这边订阅后,不用反复注册(不像api自带的那种,因为watcher是一次性的)

另一个订阅监听事件是节点数据变更,实现下面两个方法就行啦,数据变化包含数据内容和版本概念

还有一个关于连接的监听,可以监听连接状态的变化,还有session是否改变,这样做的目的可能是为了注册临时节点吧,就像dubbo服务的注册。

zkclient的打包的结构:

exception:放的都是异常类

serialize:放的是序列化实现,这边有两个实现ZkSerializer接口的类,默认是SerializableSerializer,另一个是BytesPushThroughSerializer相当于什么都没干,byte[]与object的互换而已。

另外一些是具体要参与工作的类

下面来看看订阅事件的实现,这边用了同步锁,这样的话不能同时注册多个吗?当然对zklient是没影响,因为与数据监听和状态监听使用不同的同步对象控制,不同的zklient实现,当然就更没影响啦。

这边主要执行了watchForChilds方法,这边启动一个线程,线程内先执行exists方法,后执行获取子节点的操作,其他的也是类似

既然注册了时间,总要有人去做这件事情吧,可以看到ZkClient 实现了接口org.apache.zookeeper.Watcher,watcher有个抽象方法abstract public void process(WatchedEvent event);

下面是zkclient的实现,先判断事件的类型,然后执行不同的操作,比如上面的子节点监听,和执行processDataOrChildChange(event);

子节点的变更后面执行的是ireChildChangedEvents(path, childListeners);

最后干苦力的是ZkEvent方法,这边执行了一下List<String> children = getChildren(path);重新获取了节点数据

还有就是不监听啦,就是吧对应的listener移除

 

祝大家周末愉快,我要加班 加班啊

 

© 著作权归作者所有

共有 人打赏支持
woshixin
粉丝 24
博文 240
码字总数 208603
作品 0
杭州
程序员
私信 提问
ZooKeeper学习笔记五 ZooKeeper开源客户端ZkClient

本文学习资源来自《从Paxos到ZooKeeper分布式一致性原理与实践》 ZkClient ZkClient 在ZooKeeper原生API接口之上进行了封装,是一个更易用的ZooKeeper客户端。同时,ZkClient在内部实现了诸如...

xundh
04/28
0
0
ZooKeeper 使用 ZKClient 获取子节点列表

ZkClient 是一个开源软件,也托管在 github。它封装了 zookeeper 原生 API。 使用 先需要在 javaws 网站上下载 ZKClient 的 jar 包。 注意 中的 IP 地址应该和 中配置的 IP 地址一致,且在 ...

兔之
2015/10/27
0
0
Zookeeper的集群配置和Java测试程序

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/catoop/article/details/50848555 概述 Zookeeper是Apache下的项目之一,倾向于对大型应用的协同维护管理工作...

单红宇
2016/03/10
0
0
zookeeper实现分布式锁

首先我们需要搭建至少三台zookeeper服务器,并且配置好,然后才能成功启动zookeeper。 zookeeper主要作用是存储管理节点和监听节点。实现分布式锁的核心就是利用存储临时节点,监听事件去对锁...

码家EDU
2017/10/29
0
0
Zookeeper 通知更新可靠吗? 解读源码找答案!

欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由特鲁门发表于云+社区专栏 导读: 遇到Keepper通知更新无法收到的问题,思考节点变更通知的可靠性,通过阅读源码解析了解到...

腾讯云加社区
10/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

大数据教程(7.6)shell脚本定时采集日志数据到hdfs

上一篇博客博主分享了hadoop内置rpc的使用案例,本节博主将为小伙伴们分享一个在实际生产中使用的日志搜集案例。前面的文章我们有讲到过用户点击流日志分析的流程,本节就是要完成这个分析流...

em_aaron
9分钟前
0
0
wave和pcm互转

wav->pcm pcm->wav c#代码: using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.IO;using Sys......

whoisliang
11分钟前
0
0
Win10:默认的图片打开应用,打开图片时速度明显很慢的解决办法

首先,我们随便地打开一张图片。然后,点击右上角的三个小点,最后点击弹出菜单最下面的“设置”。如下图: 在“设置”中找到下面的“人物”,把它关掉就好了。 原来,默认情况下,Win 10的图...

LivingInFHL
今天
3
0
js代码激发onchange事件,兼容谷歌火狐IE

var el = document.getElementsByName('role')[0]; el.value = '3'; var evt = document.createEvent("HTMLEvents"); evt.initEvent("change", false, true); el.dispatchEvent(evt);......

我退而结网
今天
4
0
mysql客户端报错:libmysqlclient_16 not defined in file libmysqlclient.so.16

报错情况: 安装完mydumper之后(上一篇文章),登陆Mysql客户端报错:version libmysqlclient_16 not defined in file libmysqlclient.so.16 with link time reference 同样:mysql的其他客...

machogyb
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部