watcher介紹
針對每個節(jié)點操作,都會有一個監(jiān)督者進行監(jiān)督節(jié)點操作行為。當監(jiān)控的某個 znode 發(fā)生變化,則觸發(fā) wathcer 事件。zk 中的 watcher 是一次性的,出發(fā)后立即銷毀。
一、父節(jié)點watcher
1.1 創(chuàng)建父節(jié)點會觸發(fā) NodeCreated 事件
stat /imooc watch

此處雖然為 “Node deoes not exist:/imooc”,雖然 imooc 節(jié)點不存在,但是在 created /imooc 的時候,依然可以正常的給節(jié)點添加上 watcher。
此時在執(zhí)行創(chuàng)建節(jié)點命令:
create /imooc node-data

1.2 修改父節(jié)點數(shù)據(jù)觸發(fā) NodeDataChanged 事件

get 命令同樣也可以添加 watcher
get /imooc watch

此時在對節(jié)點進行修改
set /imooc test

1.3 刪除父節(jié)點觸發(fā) NodeDeleted 事件
同樣先通過 get 命令給節(jié)點添加一個事件
get /imooc watch

此時刪除節(jié)點
delete /imooc

二、子節(jié)點watcher
2.1 創(chuàng)建/刪除子節(jié)點觸發(fā) NodeChildrenChanged 事件
對子節(jié)點進行watcher的設置,需要在父節(jié)點上進行操作
在父節(jié)點上執(zhí)行 ls /imooc watch
在該父節(jié)點上添加子節(jié)點 create /imooc/child test

再創(chuàng)建完成之后,我們先對父節(jié)點再次添加上 watcher,然后對子節(jié)點進行刪除操作
ls /imooc watch
delete /imooc/child

刪除操作還是會觸發(fā) NodeChildrenChanged 事件。
為什么創(chuàng)建和刪除子節(jié)點觸發(fā)的事件是相同的?因為對子節(jié)點的操作,其實也是站在父節(jié)點的角度來理解的。無論是子節(jié)點的創(chuàng)建還是刪除,對于父節(jié)點來說,都是對父節(jié)點中子節(jié)點進行change。
2.2 修改子節(jié)點的數(shù)據(jù)不會觸發(fā)事件
ls /imooc/child watch
set /imooc/child test-data

我們發(fā)現(xiàn)除了打印修改后的子節(jié)點信息之外,并沒有打印觸發(fā)事件的日志。
我們換種方式來添加watcher:
get /imooc/chlid new-data
set /imooc/child new-data

我們發(fā)現(xiàn)通過這種方式可以觸發(fā) NodeDataChanged 事件。
結論:
- 添加 wacher 的命令有三個:ls、get 和 stat。