博主:爱码叔
个人博客站点: icodebook
公众号:漫话软件设计
专注于软件设计与架构、技术管理。擅长用通俗易懂的语言讲解技术。对技术管理工作有自己的一定见解。文章会第一时间首发在个站上,欢迎大家关注访问!

ZooKeeper官方提供了一个Java监听的例子,本文是我对该例子的学习笔记。可以做为帮助理解此例子的资料:

文档原文连接:ZooKeeper: Because Coordinating Distributed Systems is a Zoo

翻译连接:ZooKeeper官方文档-Java客户端开发例子翻译_爱码叔(稀有气体)的博客-CSDN博客

需求理解

我们先回顾一下例子的需求,此客户端有如下四个需求:

1、它接收如下参数:

  • ZooKeeper服务的地址
  • 被监控的znode的名称
  • 可执行命令参数

2、它会取得znode上关联的数据,然后执行命令

3、如果znode变化,客户端重新拉取数据,再次执行命令

4、如果znode消失了,客户端杀掉进行的执行命令

如果你已经学习过或者了解过该例子文档的内容,你应该知道该程序做的事情就是接受用户输入的系统命令,然后监控zookeeper的znode,一旦znode存在,或者发生了变化,程序会把znode最新的数据存入文件,然后起一个线程执行用户的命令,同时还会起两个线程输出执行结果及日志。

举例类比

为了帮助理解,这里举个现实的例子--警察抓坏人:

公安成立了一个行动组准备在嫌疑人住所进行抓捕,警方人员安排如下:

  1. 组长A负责总指挥
  2. 警察B负责监控嫌疑人,并与组长A联络
  3. 警察C,D,E,F埋伏在嫌疑人住所前后左右,准备实施抓捕

整个抓捕过程是这样的:

  1. 组长A下达命令安排后,B,C各就各位(对象A做初始化工作)
  2. B开始监控嫌疑人,一旦嫌疑人进入警察布下的埋伏圈,则马上通知组长A(对象B为watcher,嫌疑人为被监听的znode。A注册为B的listener,在B的监听回调中被触发)
  3. 组长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。

通过以上讲解,这两个主要类所负责的工作应该已经可以充分的理解了。接下来我们针对这两个类进入更为详细的讲解。

内部类和接口:

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之一。

DataMonitor:

  • ZooKeeper zk; //和Executor是同一个引用。Executor通过构造函数传入
  • DataMonitorListener listener; //executor对象,Executor通过构造函数传入自己

图解

Executor和DataMonitor的关系如下:

两者通过Executor作为主入口,初始化DataMonitor和ZooKeeper对象后,阻塞主线程。转为事件驱动。即通过DataMonitor监控znode上的事件来驱动程序逻辑。

整个流程如下:

  1. Excutor把自己注册为DataMonitor的监听
  2. DataMonitor实现watcher接口,并监听znode
  3. znode变化时,触发DataMonitor的监听回调
  4. 回调中通过ZooKeeper.exist() 再次监听znode
  5. 上一步exist的回调方法中,调用监听自己的Executor,执行业务逻辑6
  6. Executor启新的线程执行命令
  7. Executor启新的线程打印执行命令的输出

ZooKeeper官方Java例子解读相关推荐

  1. ZooKeeper官方文档学习笔记04-ZooKeeper的Java实例

    碎碎念:启动成功了一半.可以启动,可以debug,但是有些方法无法访问,而且create在哪里,我还不清楚.那个DataMonitor,不能完全按照官网写,要像我一样改一下,不然会报werror,因为 ...

  2. Zookeeper的java实例

    还是在之前的模块中写这个例子: 注意在pom.xml中加上Zookeeper的依赖, 现在开始写ZookeeperDemo.java import org.apache.log4j.Logger; i ...

  3. Apache Thrift 官方JAVA教程

    Apache Thrift 官方JAVA教程 本文只是讲如何按照官方教程跑起来代码,并不会对代码细节进行介绍 配置Apache Thrift环境可以查看:Apache Thrift配置环境 这个环境仅 ...

  4. wicket 官方JAVA教程

    wicket 官方JAVA教程 最近换了工作,新公司使用的是wicket6 web框架进行开发的,自己以前没有接触过,现在开始从头学习,有些官方源码例子(例子版本:wicket7.2),以及自己简单整 ...

  5. gearman java例子_GearMan Java版试用 02- 简单应用之Worker编写和说明

    gearman分为3部分,client - server - worker,在<GearMan Java使用01>中,说明了怎么启动java版的gearman server,在这篇文章中, ...

  6. ZooKeeper Watch Java API浅析getChildren

    2019独角兽企业重金招聘Python工程师标准>>> Watch是ZooKeeper中非常重要的一个机制,它可以监控ZooKeeper中节点的变化情况,告知客户端.下面,我们以代码 ...

  7. Resnet的pytorch官方实现代码解读

    Resnet的pytorch官方实现代码解读 目录 Resnet的pytorch官方实现代码解读 前言 概述 34层网络结构的"平原"网络与"残差"网络的结构图 ...

  8. mac os java_适用于Mac OS X的官方Java 7 –状态

    mac os java 希望到目前为止,每个人都知道苹果公司去年加入了OpenJDK项目. 那是什么意思? 苹果将​​把用于私有Mac Java构建的代码作为GPL代码贡献给OpenJDK Oracl ...

  9. 适用于Mac OS X的官方Java 7 –状态

    希望到现在,每个人都知道苹果公司去年加入了OpenJDK项目. 这意味着什么? 苹果将​​把用于私有Mac Java构建的代码作为GPL代码贡献给OpenJDK 甲骨文将接管Java的Mac端口 随着 ...

  10. java web swing 教程_好程序员Java教程解读什么是swing

    原标题:好程序员Java教程解读什么是swing 好程序员Java教程解读什么是swing,swing是java GUI应用程序,也就是java做的桌面应用.运行swing程序要求用户电脑上有java ...

最新文章

  1. 剑指offer_第18题_二叉树的镜像_Python
  2. c#rs232与三菱通讯_MCGS 与 FX3U PLC 之间的无线通讯实例
  3. 用Python分析了20万场吃鸡数据,有不少有趣的发现
  4. Oracle 10g Data Guard
  5. bzoj 1833: [ZJOI2010]count 数字计数(数字0-9的个数)
  6. A1075[PAT JUDGE] 好题
  7. HTML恶搞代码 无限弹窗(超简短)
  8. freeCAD transform stepamp;amp; stp to stl logging py2exe 打包
  9. Android性能专项FPS测试实践
  10. 阳光房行业现状调研及趋势分析报告
  11. Connection reset by peer 问题解析
  12. Android 无法播放此视频
  13. 7500字拆解林清轩:说透了的“数字化转型”还有什么秘密武器?
  14. 夜神模拟器换完本机的ip连不上忘 fiddler也抓不到模拟器的包
  15. AGV导航磁条的导航方式有哪些?
  16. win10网络不出现计算机列表,win10笔记本WiFi网络列表不显示内容的解决方法
  17. The halting problem
  18. Unity 播放声音
  19. 怎么搭建在线网校系统,靠谱的网校平台搭建开发公司
  20. windows系统复制大文件提示对于目标文件系统过大的解决方案

热门文章

  1. 达梦数据库巡检脚本--生成html格式的报告
  2. 物联网环境下信息安全问题与对策
  3. Ubuntu设置Root用户开机启动
  4. 高新区智慧交通建设方案
  5. MyBatis中insert用法
  6. HTTPs SSL OV、DV和EV证书的区别
  7. 微型计算机怎么插入光盘,解决Win 7读光盘“请将磁盘插入DVD驱动器”故障
  8. Windows 提示“缺少所需的 CD/DVD 驱动器设备驱动程序”
  9. cmake出错:Building inplace are not allowed. You should create a separate directory for Building.
  10. 不到两小时教会你用JAVA制作超级玛丽小游戏