ZooKeeper专题(四)——状态变更

By timebusker on March 31, 2017

Watcher优势

通过watcher,可以避免主动轮询导致的额外负担,更加实时和有效率。

Watcher接口

仅有一个接口:
public void process(WatchedEvent event)
WatchedEvent代表watcher到的事件,它包含发生了什么事件,ZooKeeper的当前连接状态以及产生事件的ZNode路径。
1. KeeperState 2. EventType 3. path

KeeperState包含Disconnected\SyncConnected\AuthFailed\ConnectedReadOnly\SaslAuthenticated\Expired等6种状态。
EventType包含五种状态: 1. None 2. NodeCreated 3. NodeDeleted 4. NodeDataChanged 5. NodeChildrenChanged

其中后四种用于表示ZNode的状态或者数据变更,而None则用于会话的状态变更。

EventType为None的Watch

SessionWatch实例描述了,初始化一个ZooKeeper实例时注册的Watcher接口。
将在连接时收到EventType为None,KeeperState为SyncConnected,path为null的Event。
将在失去连接时收到EventType为None,KeeperState为:Disconnected,path为null的Event。

ChildrenCallback

通过getChildren方法,可以设置ChildrenCallback,以便获得获得当子节点发生变化时的相关信息。 ChildrenCallback 的唯一接口:
` public void processResult(int rc, String path, Object ctx, List children)` getChildren可以设置对应的Watcher,一旦发现节点的事件类型为NodeChildrenChanged后,可以继续设置watch。

ChildrenCallbackMonitor实例