watcher 机制主要提供了服务通知功能
Watche的分类
客户端三类,服务端两类
- dataWatches:表示监听的是某节点的数据变化,比如数据的新增、修改、删除
- childWathes:表示监听的是某节点的孩子节点的变化,如果某个节点新增或删除了,会触发其父节点上的NodeChildrenChanged事件
- existWatches(只在客户端):服务端无需单独触发该事件,由客户端接收其他事件自己判断,比如客户端接收到一个NodeCreated事件,客户端如果注册了existWatches,那么existWatches就会被触发。
不同的Watcher事件类型会触发哪些Watche
- None
-
- defaultWatcher
- 所有dataWatches(触发完可能清空)
- 所有existWatches(触发完可能清空)
- 所有childWatches(触发完可能清空)
- 所有的persistentWatches
- 所有的persistentRecursiveWatches
- NodeDataChanged
- NodeCreated
-
- 对应path的dataWatches(立马移除,先移除再执行)
- 对应path的existWatches(立马移除,先移除再执行,如果绑定了existWatche,当节点被新增或修改时触发)
- 对应path的persistentWatches
- 对应path的每层父path对应的persistentRecursiveWatches(这里有点难理解,persistentRecursiveWatches中存储的就是Watcher,这里根据当前WatchedEvent对应的path,找到该path的各层父path,然后再遍历各层父path,根据父path去从persistentRecursiveWatches集合中找当前父path是不是有对应的Watcher,如果有就添加到result中去,等待执行,这就是递归,一个子节点的数据发生了变化,父节点上的Watcher也能被触发)
- NodeChildrenChanged
-
- 对应path的childWatches(立马移除,先移除再执行)
- 对应path的persistentWatches
- 对应path的每层父path对应的persistentRecursiveWatches
- NodeDeleted
-
- 对应path的dataWatches(立马移除,先移除再执行)
- 对应path的existWatches(立马移除,先移除再执行,如果绑定了existWatche,当节点被删除时触发)
- 对应path的childWatches(立马移除,先移除再执行)
- 对应path的persistentWatches
- 对应path的每层父path对应的persistentRecursiveWatches
不同的操作触发的Watcher事件类型
- 创建节点
-
- 触发当前节点的NodeCreated事件
- 触发当前节点的父节点的NodeChildrenChanged事件
- 删除节点
-
- 触发当前节点的NodeDeleted事件
- 触发当前节点的父节点的NodeChildrenChanged事件
- 修改节点
-
- 触发当前节点的NodeDataChanged事件
注意NodeChildrenChanged事件不会触发persistentRecursiveWatches