zookeeper有兩種類型的監聽
- 監聽節點目錄的變化(增加刪除節點)
ls -w /path
創建/sanguo/shuguo的永久節點(注意:臨時節點不允許有子節點)
[zk: localhost:2181(CONNECTED) 5] create -s /sanguo/shuguo joke
Created /sanguo/shuguo0000000005
zkClient客戶端監聽/sanguo目錄的變化
[zk: localhost:2181(CONNECTED) 4] ls -w /sanguo
[shuguo, shuguo0000000002, shuguo0000000003, shuguo0000000004]
[zk: localhost:2181(CONNECTED) 5]
WATCHER::
WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/sanguo
- 監聽節點數據的變化(修改節點的值)
get -w /path
客戶端修改/sanguo的值
[zk: localhost:2181(CONNECTED) 0] get /sanguo
古代中國
[zk: localhost:2181(CONNECTED) 1] set /sanguo "古中國"
zkClient客戶端監聽/sanguo的值的改變
[zk: localhost:2181(CONNECTED) 20] get -w /sanguo
古代中國
[zk: localhost:2181(CONNECTED) 21]
WATCHER::
WatchedEvent state:SyncConnected type:NodeDataChanged path:/sanguo
注意:1.客戶端要先註冊監聽。
2.如果目錄或數據發生改變,服務端通知客戶端。客戶端接到監聽事件通知後,就不會繼續監聽。
3.需要重新註冊監聽。
zookeeper監聽機制的實現
1.創建zkClient客戶端。
2.zkClient的main()方法中啓動兩個線程。
connect線程:連接到zkServer,發送監聽請求。(請求監聽節點目錄或者節點數據)。
Listen線程:用於等待處理zkServer的監聽通知。
3.zkClient的connect線程連接到zkServer,併發送監聽事件請求。
4.zkServer接收到zkClient的監聽請求後,建立監聽列表並將監聽事件註冊到列表中。
5.zkServer一旦發現註冊的監聽事件的發生,立即通知到zkClient。
6.zkClient的listen線程調用process()處理監聽通知。