1)服务端接收Watcher并存储
接收到客户端请求,处理请求判断是否需要注册Watcher,需要的话将数据节点的节点路径和 ServerCnxn(ServerCnxn代表一个客户端和服务端的连接,实现了Watcher的process接 口,此时可以看成一个Watcher对象)存储在WatcherManager的WatchTable和 watch2Paths中去。
2)Watcher触发
以服务端接收到 setData() 事务请求触发NodeDataChanged事件为例:
封装WatchedEvent
将通知状态(SyncConnected)、事件类型(NodeDataChanged)以及节点路径封装成一 个WatchedEvent对象
查询Watcher
从WatchTable中根据节点路径查找Watcher
没找到;说明没有客户端在该数据节点上注册过Watcher
找到;提取并从WatchTable和Watch2Paths中删除对应Watcher(从这里可以看出 Watcher在服务端是一次性的,触发一次就失效了)
3)调用process方法来触发Watcher
这里process主要就是通过ServerCnxn对应的TCP连接发送Watcher事件通知。