ZooKeeper client 可以对某个znode设置watcher,以便当节点发生变化时,client能够获得相应的Event通知。若不设置watcher,则不能收到通知。
以ZooKeeper的C Client为例,可以在调用以下3个函数,get某个节点的数据或状态时,同时设置watcher标志。
zoo_exists // 节点是否存在。若设置watcher,节点被删除时,收到ZOO_DELETED_EVENT; 节点被创建时,收到ZOO_CREATED_EVENT。
zoo_get // 获取节点数据。若设置watcher,节点数据改变时,收到ZOO_CHANGED_EVENT。
zoo_get_children //获取孩子节点列表。若设置watcher,孩子节点数改变时,收到ZOO_CHILD_EVENT。
注意:
1. 设置一次Watcher(不能重复设置,只相当于设置一次)只能收到一次Event通知,之后若节点再发生变化,不会再次收到通知,因此每次收到Event后,需要对节点重新设置Watcher。
2. zoo_exists可以对尚未创建的节点设置watcher,节点创建时发送CREATED_EVENT;反之,节点删除时发送DELETED_EVENT。
3. zoo_get,zoo_get_children不能对尚未创建的节点设置watcher,创建之前设置的watcher在节点创建后是无效的。
(但节点创建后,若通过zoo_esixts设置watcher,之前zoo_get设置的watcher似乎变得有效)
4. zoo_get, zoo_get_children对存在的节点设置watcher后,若节点被删除,watcher将失效,也就是说节点被重新创建后,之前设置的watcher将变得无效。