A Simple Watch Client:一個(gè)簡(jiǎn)單的監(jiān)聽(tīng)器示例
功能:通過(guò)讀取Znode的數(shù)據(jù)來(lái)啟動(dòng)某個(gè)服務(wù)。并且動(dòng)態(tài)監(jiān)聽(tīng)Znode變更事件息罗,如果znode發(fā)生變化,則傳入新數(shù)據(jù)并重啟服務(wù),如果節(jié)點(diǎn)被刪除迹蛤,則服務(wù)停止.需要傳入幾個(gè)參數(shù):Zookeeper服務(wù)端地址、Znode名稱、用于寫(xiě)數(shù)據(jù)的文件盗飒、帶參數(shù)的執(zhí)行體
設(shè)計(jì):實(shí)現(xiàn)兩個(gè)工具類(lèi)穷缤,Executor用于保持會(huì)話,并且提供某個(gè)可執(zhí)行服務(wù)箩兽。DataMonitor用于監(jiān)聽(tīng)數(shù)據(jù)變化
輔助文件:數(shù)據(jù)文件A用于存儲(chǔ)從znode里獲取的數(shù)據(jù)津肛,指令文件B用于通過(guò)Java exec調(diào)用
Executor Class:分為5部分
Eexcutor:繼承了Watcher接口,實(shí)現(xiàn)了process方法汗贫,用于事件回調(diào)身坐。繼承了runnable接口,實(shí)現(xiàn)run方法落包,用于保證客戶端不退出部蛇。繼承自定義的DataMonotorListener接口,實(shí)現(xiàn)了exists和closing方法咐蝇。當(dāng)znode創(chuàng)建或者刪除時(shí)會(huì)觸發(fā)調(diào)用exists方法涯鲁,當(dāng)會(huì)話過(guò)期時(shí)會(huì)觸發(fā)closing方法。
DataMonitor class:主要分為3部分
再來(lái)看下執(zhí)行過(guò)程
首先啟動(dòng)服務(wù)有序,這個(gè)時(shí)候zookeeper不存在/test 這個(gè)節(jié)點(diǎn)抹腿。會(huì)看到如下輸出:
創(chuàng)建/test:然后在zookeeper服務(wù)端創(chuàng)建/test ,create /test "data1",然后看到客戶端輸出:
更改/test 的值:set /test "data2"旭寿,然后看到客戶端輸出:
刪除/test,:delete /test警绩,看到如下輸出:
并且看下本地?cái)?shù)據(jù)文件里寫(xiě)入的內(nèi)容:
至于說(shuō),當(dāng)znode狀態(tài)發(fā)生變化如何回調(diào)watcher的process方法盅称,以及異步請(qǐng)求完成后如何自動(dòng)回調(diào)StatCallback的processResult方法肩祥,我們?cè)诹硪黄创a分析里來(lái)一探究竟
參考文章:http://zookeeper.apache.org/doc/current/javaExample.html