ZooKeeper官方文档之Java案例解读

 更新时间:2022年01月27日 14:59:25   作者:爱码叔(稀有气体)  
ZooKeeper官方提供了一个Java监听的例子,本文是我对该例子的学习笔记。可以做为帮助理解此例子的资料,有需要的朋友可以借鉴参考下

文档原文连接:http://zookeeper.apache.org/doc/current/javaExample.html#sc_completeSourceCode

翻译连接:https://www.jb51.net/article/236127.htm

需求理解

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

1、它接收如下参数:

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

2、它会取得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。

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

内部类和接口

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例子解读的详细内容,更多关于ZooKeeper文档翻译Java例子的资料请关注脚本之家其它相关文章!

相关文章

  • 手把手带你了解Java-Stream流方法学习及总结

    手把手带你了解Java-Stream流方法学习及总结

    这篇文章主要介绍了通过实例了解JavaStream流的方法学习和总结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2021-08-08
  • 在Spring中实现异步处理的步骤和代码演示

    在Spring中实现异步处理的步骤和代码演示

    在Spring中实现异步处理通常涉及到@Async注解,通过步骤和代码演示,可以在Spring应用程序中实现异步处理,记住要根据你的应用程序的实际需求来调整线程池和异步方法的设计,感兴趣的朋友跟随小编一起看看吧
    2024-06-06
  • Spring中的aware接口详情

    Spring中的aware接口详情

    这篇文章主要介绍了Spring中的aware接口详情,Spring中有很多继承于aware中的接口,这些接口到底是做什么用到的,下面我们就一起来看看吧,文章详细内容需要的小伙伴可以参考一下
    2022-05-05
  • SpringBoot实现微信及QQ绑定登录的示例代码

    SpringBoot实现微信及QQ绑定登录的示例代码

    本文主要介绍了SpringBoot实现微信及QQ绑定登录的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • Java面试官最喜欢问的关键字之volatile详解

    Java面试官最喜欢问的关键字之volatile详解

    这篇文章主要给大家介绍了关于Java面试官最喜欢问的关键字之volatile的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Java具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-03-03
  • Java数据结构及算法实例:朴素字符匹配 Brute Force

    Java数据结构及算法实例:朴素字符匹配 Brute Force

    这篇文章主要介绍了Java数据结构及算法实例:朴素字符匹配 Brute Force,本文直接给出实例代码,代码中包含详细注释,需要的朋友可以参考下
    2015-06-06
  • MyBatis 如何简化的 JDBC(思路详解)

    MyBatis 如何简化的 JDBC(思路详解)

    MyBatis 是一个 持久层 框架,用于 简化JDBC开发,这篇文章主要介绍了MyBatis 如何简化的 JDBC(思路详解),需要的朋友可以参考下
    2023-03-03
  • Java C++解决在排序数组中查找数字出现次数问题

    Java C++解决在排序数组中查找数字出现次数问题

    本文终于介绍了分别通过Java和C++实现统计一个数字在排序数组中出现的次数。文中详细介绍了实现思路,感兴趣的小伙伴可以跟随小编学习一下
    2021-12-12
  • SpringBoot框架整合Mybatis简单攻略

    SpringBoot框架整合Mybatis简单攻略

    这篇文章主要介绍了SpringBoot框架整合Mybatis的简单攻略,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2021-10-10
  • MybatisPlus自定义Sql实现多表查询的示例

    MybatisPlus自定义Sql实现多表查询的示例

    这篇文章主要介绍了MybatisPlus自定义Sql实现多表查询的示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08

最新评论