ZooKeeper官方文档之Java案例解读
目录
- 需求理解
- 举例类比
- Executor和DataMonitor
- 内部类和接口
- Executor:
- DataMonitor:
- 继承关系
- Executor:
- DataMonitor:
- 引用关系
- Executor:
- DataMonitor:
- 图解
翻译连接:https://www.jb51.net/article/236127.htm
需求理解 我们先回顾一下例子的需求,此客户端有如下四个需求:
1、它接收如下参数:
- ZooKeeper服务的地址
- 被监控的znode的名称
- 可执行命令参数
3、如果znode变化,客户端重新拉取数据,再次执行命令
4、如果znode消失了,客户端杀掉进行的执行命令
如果你已经学习过或者了解过该例子文档的内容,你应该知道该程序做的事情就是接受用户输入的系统命令,然后监控zookeeper的znode,一旦znode存在,或者发生了变化,程序会把znode最新的数据存入文件,然后起一个线程执行用户的命令,同时还会起两个线程输出执行结果及日志。
举例类比 为了帮助理解,这里举个现实的例子--警察抓坏人:
公安成立了一个行动组准备在嫌疑人住所进行抓捕,警方人员安排如下:
- 组长A负责总指挥
- 警察B负责监控嫌疑人,并与组长A联络
- 警察C,D,E,F埋伏在嫌疑人住所前后左右,准备实施抓捕
- 组长A下达命令安排后,B,C各就各位(对象A做初始化工作)
- B开始监控嫌疑人,一旦嫌疑人进入警察布下的埋伏圈,则马上通知组长A(对象B为watcher,嫌疑人为被监听的znode。A注册为B的listener,在B的监听回调中被触发)
- 组长A得到通知后,马上命令C、D、E、F执行抓捕。(C,D,E是被A调用干活的线程)
Executor和DataMonitor 本例中有两个主要类,职能如下:
Executor
,它是程序的入口。负责初始化zookeeper、DataMonitor,把自己注册为DataMonitor的监听者,一旦DataMonitor监听到变化后,会通知它执行业务操作。他是例子中的组长A,它有几个内部类是前面说的警员C、D、E、F,负责干活。
DataMonitor
,他负责监控znode,发现znode变化后,通知listener执行业务逻辑,同时再次监控znode:他是例子中的警察B,负责监控犯人,并通知A。
通过以上讲解,这两个主要类所负责的工作应该已经可以充分的理解了。接下来我们针对这两个类进入更为详细的讲解。
【ZooKeeper官方文档之Java案例解读】
内部类和接口
Executor: StreamWriter。继承Thread,以多线程的形式负责把执行的结果输出。相当于例子中的警察C、D、E、F
DataMonitor: DataMonitorListener。DataMonitor一旦监控到znode的变化,立即调用自己持有的listener(实现此接口的对象)的exists方法(通知它的监听者)。
继承关系
Executor: 实现watcher:监听zookeeper连接的变化,实现process()方法,把事件传递给DataMonitor处理。
实现DataMonitor中定义的接口DataListener: 实现exists()方法,处理znode变化的具体逻辑。
实现runnable类: run()方法中阻塞主线程,让程序转为事件驱动。
public class Executor implements Watcher, Runnable, DataMonitor.DataMonitorListener{}
DataMonitor: 实现watcher:
监听znode变化。实现process()方法,通过zk.exist()方法再次监听,再次设置自己为zookeeper.exist()的回调(实现不断监听,事件驱动)。同时数据返回后,立即进入下面的回调函数处理
实现StatCallback:
这是zookeeper.exist()操作回调对象。实现processResult()方法,调用DataMonitor持有的listener(也就是Excutor)的exists()方法执行逻辑。
public class DataMonitor implements Watcher, StatCallback{}
引用关系
Executor:
- DataMonitor dm;
- ZooKeeper zk; //ZooKeeper的连接
- Process child; //真正执行系统命令的子线程,相当于警察C,D,E,F之一。
- ZooKeeper zk; //和Executor是同一个引用。Executor通过构造函数传入
- DataMonitorListener listener; //executor对象,Executor通过构造函数传入自己
图解
Executor和DataMonitor的关系如下:
![ZooKeeper官方文档之Java案例解读](https://img.it610.com/image/info11/8f5d0a6ef3654c75899e398f8180394c.jpg)
文章图片
两者通过Executor作为主入口,初始化DataMonitor和ZooKeeper对象后,阻塞主线程。转为事件驱动。即通过DataMonitor监控znode上的事件来驱动程序逻辑。
整个流程如下:
![ZooKeeper官方文档之Java案例解读](https://img.it610.com/image/info11/71694f555bd34717960fda4e0372e418.jpg)
文章图片
- Excutor把自己注册为DataMonitor的监听
- DataMonitor实现watcher接口,并监听znode
- znode变化时,触发DataMonitor的监听回调
- 回调中通过ZooKeeper.exist() 再次监听znode
- 上一步exist的回调方法中,调用监听自己的Executor,执行业务逻辑6
- Executor启新的线程执行命令
- Executor启新的线程打印执行命令的输出
推荐阅读
- 什么是FAQ(怎么编写FAQ文档?)
- 微软|狠! 在GitHub 上 Star 高达 72K 的项目 Youtube-dl 惨遭官方下架!
- 软件商店上新(石墨文档、Shotcut 等 5 款便捷办公类软件上线!)
- AI换脸教程|deepfacelive实时AI换脸直播使用教程
- figma安装包_Figma软件下载|UI界面设计软件(Figma)下载 v3.0.4 官方版 - 比克尔下载...
- springboot|使用Swagger实现接口文档
- java|Aspose.Words 19.X 文档转换 反编译破解 Crack
- ElasticSearch|ElasticSearch 文档(document)内部机制详解
- 2022最新IntellJ|2022最新IntellJ IDEA诺依开发部署文档
- 程序员|官方都不推荐(为什么MySQL不推荐使用uuid作为主键?究竟有什么坏处)