watcher介绍
针对每个节点操作,都会有一个监督者进行监督节点操作行为。当监控的某个 znode 发生变化,则触发 wathcer 事件。zk 中的 watcher 是一次性的,出发后立即销毁。
一、父节点watcher
1.1 创建父节点会触发 NodeCreated 事件
stat /imooc watch

此处虽然为 “Node deoes not exist:/imooc”,虽然 imooc 节点不存在,但是在 created /imooc 的时候,依然可以正常的给节点添加上 watcher。
此时在执行创建节点命令:
create /imooc node-data

1.2 修改父节点数据触发 NodeDataChanged 事件

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

此时在对节点进行修改
set /imooc test

1.3 删除父节点触发 NodeDeleted 事件
同样先通过 get 命令给节点添加一个事件
get /imooc watch

此时删除节点
delete /imooc

二、子节点watcher
2.1 创建/删除子节点触发 NodeChildrenChanged 事件
对子节点进行watcher的设置,需要在父节点上进行操作
在父节点上执行 ls /imooc watch
在该父节点上添加子节点 create /imooc/child test

再创建完成之后,我们先对父节点再次添加上 watcher,然后对子节点进行删除操作
ls /imooc watch
delete /imooc/child

删除操作还是会触发 NodeChildrenChanged 事件。
为什么创建和删除子节点触发的事件是相同的?因为对子节点的操作,其实也是站在父节点的角度来理解的。无论是子节点的创建还是删除,对于父节点来说,都是对父节点中子节点进行change。
2.2 修改子节点的数据不会触发事件
ls /imooc/child watch
set /imooc/child test-data

我们发现除了打印修改后的子节点信息之外,并没有打印触发事件的日志。
我们换种方式来添加watcher:
get /imooc/chlid new-data
set /imooc/child new-data

我们发现通过这种方式可以触发 NodeDataChanged 事件。
结论:
- 添加 wacher 的命令有三个:ls、get 和 stat。
网友评论