最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

ZooKeeper官方文檔之Java案例解讀

 更新時(shí)間:2022年01月27日 14:59:25   作者:愛碼叔(稀有氣體)  
ZooKeeper官方提供了一個(gè)Java監(jiān)聽的例子,本文是我對該例子的學(xué)習(xí)筆記??梢宰鰹閹椭斫獯死拥馁Y料,有需要的朋友可以借鑒參考下

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

翻譯連接:http://www.fzitv.net/article/236127.htm

需求理解

我們先回顧一下例子的需求,此客戶端有如下四個(gè)需求:

1、它接收如下參數(shù):

  • ZooKeeper服務(wù)的地址
  • 被監(jiān)控的znode的名稱
  • 可執(zhí)行命令參數(shù)

2、它會(huì)取得znode上關(guān)聯(lián)的數(shù)據(jù),然后執(zhí)行命令

3、如果znode變化,客戶端重新拉取數(shù)據(jù),再次執(zhí)行命令

4、如果znode消失了,客戶端殺掉進(jìn)行的執(zhí)行命令

如果你已經(jīng)學(xué)習(xí)過或者了解過該例子文檔的內(nèi)容,你應(yīng)該知道該程序做的事情就是接受用戶輸入的系統(tǒng)命令,然后監(jiān)控zookeeper的znode,一旦znode存在,或者發(fā)生了變化,程序會(huì)把znode最新的數(shù)據(jù)存入文件,然后起一個(gè)線程執(zhí)行用戶的命令,同時(shí)還會(huì)起兩個(gè)線程輸出執(zhí)行結(jié)果及日志。

舉例類比

為了幫助理解,這里舉個(gè)現(xiàn)實(shí)的例子--警察抓壞人:

公安成立了一個(gè)行動(dòng)組準(zhǔn)備在嫌疑人住所進(jìn)行抓捕,警方人員安排如下:

  • 組長A負(fù)責(zé)總指揮
  • 警察B負(fù)責(zé)監(jiān)控嫌疑人,并與組長A聯(lián)絡(luò)
  • 警察C,D,E,F(xiàn)埋伏在嫌疑人住所前后左右,準(zhǔn)備實(shí)施抓捕

整個(gè)抓捕過程是這樣的:

  • 組長A下達(dá)命令安排后,B,C各就各位(對象A做初始化工作)
  • B開始監(jiān)控嫌疑人,一旦嫌疑人進(jìn)入警察布下的埋伏圈,則馬上通知組長A(對象B為watcher,嫌疑人為被監(jiān)聽的znode。A注冊為B的listener,在B的監(jiān)聽回調(diào)中被觸發(fā))
  • 組長A得到通知后,馬上命令C、D、E、F執(zhí)行抓捕。(C,D,E是被A調(diào)用干活的線程)

理解了上線的例子,我們繼續(xù)對程序進(jìn)行講解。

Executor和DataMonitor

本例中有兩個(gè)主要類,職能如下:

Executor,它是程序的入口。負(fù)責(zé)初始化zookeeper、DataMonitor,把自己注冊為DataMonitor的監(jiān)聽者,一旦DataMonitor監(jiān)聽到變化后,會(huì)通知它執(zhí)行業(yè)務(wù)操作。

他是例子中的組長A,它有幾個(gè)內(nèi)部類是前面說的警員C、D、E、F,負(fù)責(zé)干活。

DataMonitor,他負(fù)責(zé)監(jiān)控znode,發(fā)現(xiàn)znode變化后,通知listener執(zhí)行業(yè)務(wù)邏輯,同時(shí)再次監(jiān)控znode:

他是例子中的警察B,負(fù)責(zé)監(jiān)控犯人,并通知A。

通過以上講解,這兩個(gè)主要類所負(fù)責(zé)的工作應(yīng)該已經(jīng)可以充分的理解了。接下來我們針對這兩個(gè)類進(jìn)入更為詳細(xì)的講解。

內(nèi)部類和接口

Executor:

        StreamWriter。繼承Thread,以多線程的形式負(fù)責(zé)把執(zhí)行的結(jié)果輸出。相當(dāng)于例子中的警察C、D、E、F

DataMonitor:

        DataMonitorListener。DataMonitor一旦監(jiān)控到znode的變化,立即調(diào)用自己持有的listener(實(shí)現(xiàn)此接口的對象)的exists方法(通知它的監(jiān)聽者)。

繼承關(guān)系

Executor:

實(shí)現(xiàn)watcher:監(jiān)聽zookeeper連接的變化,實(shí)現(xiàn)process()方法,把事件傳遞給DataMonitor處理。 

實(shí)現(xiàn)DataMonitor中定義的接口DataListener: 實(shí)現(xiàn)exists()方法,處理znode變化的具體邏輯。

實(shí)現(xiàn)runnable類: run()方法中阻塞主線程,讓程序轉(zhuǎn)為事件驅(qū)動(dòng)。

public class Executor implements Watcher, Runnable, DataMonitor.DataMonitorListener{}

DataMonitor:

實(shí)現(xiàn)watcher:

監(jiān)聽znode變化。實(shí)現(xiàn)process()方法,通過zk.exist()方法再次監(jiān)聽,再次設(shè)置自己為zookeeper.exist()的回調(diào)(實(shí)現(xiàn)不斷監(jiān)聽,事件驅(qū)動(dòng))。同時(shí)數(shù)據(jù)返回后,立即進(jìn)入下面的回調(diào)函數(shù)處理

實(shí)現(xiàn)StatCallback:

這是zookeeper.exist()操作回調(diào)對象。實(shí)現(xiàn)processResult()方法,調(diào)用DataMonitor持有的listener(也就是Excutor)的exists()方法執(zhí)行邏輯。

public class DataMonitor implements Watcher, StatCallback{} 

引用關(guān)系

Executor:

  • DataMonitor dm;
  • ZooKeeper zk; //ZooKeeper的連接
  • Process child; //真正執(zhí)行系統(tǒng)命令的子線程,相當(dāng)于警察C,D,E,F(xiàn)之一。

DataMonitor:

  • ZooKeeper zk; //和Executor是同一個(gè)引用。Executor通過構(gòu)造函數(shù)傳入
  • DataMonitorListener listener; //executor對象,Executor通過構(gòu)造函數(shù)傳入自己 

圖解

Executor和DataMonitor的關(guān)系如下:

兩者通過Executor作為主入口,初始化DataMonitor和ZooKeeper對象后,阻塞主線程。轉(zhuǎn)為事件驅(qū)動(dòng)。即通過DataMonitor監(jiān)控znode上的事件來驅(qū)動(dòng)程序邏輯。

整個(gè)流程如下:

  1. Excutor把自己注冊為DataMonitor的監(jiān)聽
  2. DataMonitor實(shí)現(xiàn)watcher接口,并監(jiān)聽znode
  3. znode變化時(shí),觸發(fā)DataMonitor的監(jiān)聽回調(diào)
  4. 回調(diào)中通過ZooKeeper.exist() 再次監(jiān)聽znode
  5. 上一步exist的回調(diào)方法中,調(diào)用監(jiān)聽自己的Executor,執(zhí)行業(yè)務(wù)邏輯6
  6. Executor啟新的線程執(zhí)行命令
  7. Executor啟新的線程打印執(zhí)行命令的輸出

以上就是ZooKeeper官方文檔翻譯之Java例子解讀的詳細(xì)內(nèi)容,更多關(guān)于ZooKeeper文檔翻譯Java例子的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java多線程處理文件的示例詳解

    Java多線程處理文件的示例詳解

    在Java編程中,文件處理是一項(xiàng)常見的任務(wù),為了提高文件處理的效率,我們可以使用多線程技術(shù),本文將詳細(xì)介紹如何使用Java多線程來處理文件,需要的可以參考下
    2024-12-12
  • Java正則表達(dá)式之分組和替換方式

    Java正則表達(dá)式之分組和替換方式

    這篇文章主要介紹了Java正則表達(dá)式之分組和替換方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Integer和int的區(qū)別實(shí)例詳解

    Integer和int的區(qū)別實(shí)例詳解

    這篇文章主要介紹了Integer和int的區(qū)別實(shí)例詳解,文字和代碼實(shí)例講解的很清楚,有感興趣的同學(xué)可以學(xué)習(xí)下
    2021-03-03
  • SpringBoot圖片上傳和訪問路徑映射

    SpringBoot圖片上傳和訪問路徑映射

    這篇文章主要為大家詳細(xì)介紹了SpringBoot圖片上傳和訪問路徑映射,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • Java設(shè)計(jì)模式之中介模式(Mediator模式)介紹

    Java設(shè)計(jì)模式之中介模式(Mediator模式)介紹

    這篇文章主要介紹了Java設(shè)計(jì)模式之中介模式(Mediator模式)介紹,本文講解了為何使用Mediator模式、如何使用中介模式等內(nèi)容,需要的朋友可以參考下
    2015-03-03
  • Java多線程深入理解

    Java多線程深入理解

    這篇文章主要介紹了java多線程編程實(shí)例,分享了幾則多線程的實(shí)例代碼,具有一定參考價(jià)值,加深多線程編程的理解還是很有幫助的,需要的朋友可以參考下
    2021-07-07
  • Java cglib為實(shí)體類(javabean)動(dòng)態(tài)添加屬性方式

    Java cglib為實(shí)體類(javabean)動(dòng)態(tài)添加屬性方式

    這篇文章主要介紹了Java cglib為實(shí)體類(javabean)動(dòng)態(tài)添加屬性方式,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • SpringBoot2底層注解@Configuration配置類詳解

    SpringBoot2底層注解@Configuration配置類詳解

    這篇文章主要為大家介紹了SpringBoot2底層注解@Configuration配置類詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • Spring Boot單元測試中使用mockito框架mock掉整個(gè)RedisTemplate的示例

    Spring Boot單元測試中使用mockito框架mock掉整個(gè)RedisTemplate的示例

    今天小編就為大家分享一篇關(guān)于Spring Boot單元測試中使用mockito框架mock掉整個(gè)RedisTemplate的示例,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • java實(shí)現(xiàn)多個(gè)文件壓縮成壓縮包

    java實(shí)現(xiàn)多個(gè)文件壓縮成壓縮包

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)多個(gè)文件壓縮成壓縮包,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-07-07

最新評論

衢州市| 黄冈市| 渑池县| 姚安县| 城市| 和平县| 肥西县| 景洪市| 兴宁市| 融水| 盘锦市| 广州市| 天全县| 长阳| 昌图县| 汝南县| 宝鸡市| 工布江达县| 和田县| 太保市| 汉源县| 阳西县| 鄱阳县| 静海县| 疏附县| 都匀市| 新津县| 上蔡县| 台北市| 海阳市| 庆阳市| 阿勒泰市| 太保市| 大余县| 喀什市| 华宁县| 亳州市| 太保市| 新晃| 尉氏县| 桂东县|