322e 发表于 2015-11-22 08:17:12

ZooKeeper 通过client 对指定节点设置watcher的注意事项

  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将变得无效。

  

  Initialized path: /a             watched nodeszoo_existszoo_getzoo_get_childrenActionEvent/a/a/b/a/b/cEvent/a/a/b/a/b/cEvent/a/a/b/a/b/ccreate /a/bCREATED–√–CHILD√––create /a/b/cCREATED––√CHILD–x–delete /a/b/cDELETED––√CHILD–x–delete /a/bDELETED–√–CHILD√––set /a dataCHANGED√––create /a/bCREATED–√–CHILD√––set /a/b dataCHANGED–√–create /a/b/cCREATED––√CHILD–x–set /a/b/c data
CHANGED––√
页: [1]
查看完整版本: ZooKeeper 通过client 对指定节点设置watcher的注意事项