zk三种注册监听方式:getData(),exists,getChildren。
客户端发送的监听请求会放到队列中(outgoingQueue),队列会有一个 sendThread 处理,sendThread 通过发送 path 路径和 watcher 为 true ,到 server 注册 watch 事件。
zk服务端会有一个 WatchManger 该类中有 HashMap<String,HashSet<Watcher>> watchTable ,key为path , Watcher 是一个客户端网络连接封装,当节点变化时会通知对应的连接(连接通过心跳保持)。
客户端发送完后本地会有一个 ZKwatcherManager 类,该类中保存了 Map<String,Set<Watcher>> dataWatchers、Map<String,Set<Watcher>> existsWatchers、Map<String,Set<Watcher>> childrenWatchers 三个集合,客户端会在 dataWatchers 中会添加一个 key 为 path 路径的本地事件。
当服务端节点变化时会从 watchTable 中拿到对应 path 的 Watcher 集合通知到客户端,通知完后就会删除改连接,客户端根据返回结果中的 path 拿到 dataWatchers 中的本地事件进行调用。
因为服务端已经把链接删除,如果客户端想要继续监听该节点需要再次发起监听请求。