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_getzoo_get_children不能对尚未创建的节点设置watcher创建之前设置的watcher在节点创建后是无效的。

(但节点创建后,若通过zoo_esixts设置watcher,之前zoo_get设置的watcher似乎变得有效)

4. zoo_get, zoo_get_children对存在的节点设置watcher后,若节点被删除,watcher将失效,也就是说节点被重新创建后,之前设置的watcher将变得无效。


Initialized path: /a            
  watched nodes

zoo_exists zoo_get zoo_get_children
ActionEvent/a/a/b/a/b/cEvent/a/a/b/a/b/cEvent/a/a/b/a/b/c
create /a/bCREATED



CHILD
create /a/b/cCREATED



CHILDx
delete /a/b/cDELETED



CHILDx
delete /a/bDELETED



CHILD
set /a data



CHANGED



create /a/bCREATED



CHILD
set /a/b data



CHANGED



create /a/b/cCREATED



CHILDx
set /a/b/c data



CHANGED




Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐