下面表格列出了寫操做與ZK內部產生的事件的對應關係: git
event For "/path" | event For "/path/child" | |
---|---|---|
create("/path") | EventType.NodeCreated | NA |
delete("/path") | EventType.NodeDeleted | NA |
setData("/path") | EventType.NodeDataChanged | NA |
create("/path/child") | EventType.NodeChildrenChanged | EventType.NodeCreated |
delete("/path/child") | EventType.NodeChildrenChanged | EventType.NodeDeleted |
setData("/path/child") | NA | EventType.NodeDataChanged |
而ZK內部的寫事件與所觸發的watcher的對應關係以下: github
event For "/path" | defaultWatcher | exists ("/path") |
getData ("/path") |
getChildren ("/path") |
---|---|---|---|---|
EventType.None | √ | √ | √ | √ |
EventType.NodeCreated | √ | √ | ||
EventType.NodeDeleted | √(不正常) | √ | ||
EventType.NodeDataChanged | √ | √ | ||
EventType.NodeChildrenChanged | √ |
綜合上面兩個表,咱們能夠總結出各類寫操做能夠觸發哪些watcher,以下表所示: session
"/path" | "/path/child" | |||||
---|---|---|---|---|---|---|
exists | getData | getChildren | exists | getData | getChildren | |
create("/path") | √ | √ | ||||
delete("/path") | √ | √ | √ | |||
setData("/path") | √ | √ | ||||
create("/path/child") | √ | √ | √ | |||
delete("/path/child") | √ | √ | √ | √ | ||
setData("/path/child") | √ | √ |
若是發生session close、authFail和invalid,那麼全部類型的wather都會被觸發 spa
zkClient除了作了一些便捷包裝以外,對watcher使用作了一點加強。好比subscribeChildChanges其實是經過exists和getChildren關注了兩個事件。這樣當create("/path")時,對應path上經過getChildren註冊的listener也會被調用。另外subscribeDataChanges實際上只是經過exists註冊了事件。由於從上表能夠看到,對於一個更新,經過exists和getData註冊的watcher要麼都會觸發,要麼都不會觸發。 事件
zkClient地址:https://github.com/sgroschupf/zkclient ci