zk的注册总体图
客户端在向zk服务器注册Watcher的同时,会将Watcher对象存储在客户端的WatchManager中。
当zk服务端触发Watcher事件后,会向客户端发送通知,客户端线程从WatcherManager中取出对应的Watcher对象。来执行回调逻辑。
Watcher接口
Watcher是一个标准的事件处理器,其定义了事件通知相关的逻辑,包含KeeperState和EventState,分别代表通知状态和事件类型,在回调process中进行处理。
public abstract void process(WatchedEvent event);
WatchedEvent类
public class WatchedEvent
{
//是一个枚举类,代表通知状态,是链接的,还是断开的。
keeperState;
//是一个枚举类,代表事件类型,当处于连接时,事件是子节点变化等事件
eventType
//节点路径
path
}
WatcherEvent类
WatcherEvent
{
//代表事件类型
type:int;
//代表节点状态
state:int;
path:String
}
总结:WatchedEvent和WatcherEvent表示的是同一个事物。WatchedEvent是一个逻辑事件,用于服务端和客户端程序执行过程中所需的逻辑对象。而WatcherEvent因为实现了序列化接口,因此,可以用于网络传输。
服务端在生成WatchedEvent事件之后,会调用getWrapper方法将自己包装成一个WatcherEvent,以便通过网络传输到客户端,客户端在接收到服务端的这个事件对象后,首先会将WatcherEvent事件还原成一个WatchedEvent事件,并传递给process方法进行处理。
从事件可以看到,客户端无法直接从该事件中获取到对应数据节点的原始数据内容以及变更后的新数据内容。
客户端注册Watcher
- 在创建一个zk对象实例时,可以在构造函数中传入一个默认的Watcher。默认的Watcher作为整个zk会话期间的默认Watcher,会一直保存在客户端的ZkWatchManager的defaultWatcher中。
- ZkWatchManager数据结构