轉載自:
http://zoutm.iteye.com/blog/708468
http://blog.csdn.net/qq910894904/article/details/41726279
Watcher介紹:
Watcher是Zookeeper用來實現distribute lock, distribute configure, distribute queue等應用的主要手段。要監控data_tree上的任何節點的變化(節點本身的增加,刪除,數據修改,以及孩子的變化)都可以在獲取該數據時註冊一個Watcher,這有很像Listener模式。一旦該節點數據變化,Follower會發送一個notification response,client收到notification響應,則會查找對應的Watcher並回調他們。 有以下接口可以註冊Watcher:
Stat exists(final String path, Watcher watcher)
Stat exists(String path, boolean watch)
void exists(String path, boolean watch, StatCallback cb, Object ctx)
void exists(final String path, Watcher watcher, StatCallback cb, Object ctx)
byte[] getData(final String path, Watcher watcher, Stat stat)
byte[] getData(String path, boolean watch, Stat stat)
void getData(final String path, Watcher watcher, DataCallback cb, Object ctx)
void getData(String path, boolean watch, DataCallback cb, Object ctx)
List getChildren(final String path, Watcher watcher)
List getChildren(String path, boolean watch)
void getChildren(final String path, Watcher watcher,ChildrenCallback cb, Object ctx)
如果參數需要傳遞watcher,則可以自己定義Watcher進行回調處理。如果是Boolean型變量,當爲true時,則使用系統默認的Watcher,系統默認的Watcher是在zookeeper的構造函數中傳遞的Watcher。如果Watcher爲空或者Boolean變量時爲false,則表明不註冊Watcher。如果獲取數據後不需要關注該數據是否變化,就不需要註冊Watcher。上面沒有返回值的都是異步調用模式。需要注意的是,一旦Watcher被調用後,將會從map中刪除,如果還需要關注數據的變化,需要再次註冊。 Watcher原理 要搞清楚Watcher的原理,讓我們看看Watcher的工作流程。
Watcher的使用與注意事項
Watcher需要每次都要註冊。
並不是Watcher的節點被修改n次,客戶端註冊就會被通知n次。如果watcher的節點頻繁被修改,有可能修改了10次,客戶端被通知8次。如果client與server連接狀態發生改變,watcher總是會被通知。
Watcher通知類型:
- state=-112 會話超時狀態
- state= -113 認證失敗狀態
- state= 1 連接建立中
- state= 2 (暫時不清楚如何理解這個狀態,ZOO_ASSOCIATING_STATE)
- state=3 連接已建立狀態
- state= 999 無連接狀態
- type=1 創建節點事件
- type=2 刪除節點事件
- type=3 更改節點事件
- type=4 子節點列表變化事件
- type= -1 會話session事件
- type=-2 監控被移除事件
對父節點的變更以及孫節點的變更都不會觸發watcher,而對watcher本身節點以及子節點的變更會觸發watcher,具體參照下表。
注:×表示否,√表示是。
更多參見 http://tech.uc.cn/?p=1189,不過該文章中第五節對event和state的說明有誤,請仔細辨別。