文章目錄
- Curator API 常用操作 Watch事件監聽
- NodeCache
- PathChildrenCache
- TreeCache
本章代碼已分享至Gitee: https://gitee.com/lengcz/curator01
Curator API 常用操作 Watch事件監聽
-
zookeeper 允許用戶在指定節點上注冊一些Watcher ,并且在一些特定事件觸發的時候,zookeeper 服務端會將事件通知到感興趣的客戶端上,該機制是zookeeper 實現分布式協調服務的重要特性。
-
zookeeper 中引入了Wather 機制來實現了發布/訂閱功能,能夠讓多個訂閱者同時監聽某一個對象,當一個對象自身狀態發生變化時,會通知所有訂閱者。
-
zookeeper 原生支持通過注冊Wather 來進行事件監聽,但是其使用起來特別不方便,需要開發人員自己反復注冊Wather,比較繁瑣。
-
Curator 引入了Cache 來實現對zookeeper 服務端事件的監聽。
-
zookeeper 提供了三種Watcher
-
- NodeCache : 只是監聽某一個特定的節點
-
- PathChildrenCache: 監聽一個ZNode的子節點。
-
- TreeCache :可以監控整個樹上的所有節點,類似于PathChildrenCache和NodeCache 的結合
NodeCache
NodeCache 用于監聽單個節點的變化,包括節點的創建、更新和刪除事件。適用于需要關注特定節點數據變化的場景。
/*** NodeCache 給指定一個節點注冊監聽器* @throws Exception*/@Testpublic void testNodeCache() throws Exception{//1 創建NodeCache 對象NodeCache nodeCache = new NodeCache(client,"/app1",false);//2 注冊監聽nodeCache.getListenable().addListener(new NodeCacheListener() {@Overridepublic void nodeChanged() throws Exception {logger.info("節點變化了");byte[] data = nodeCache.getCurrentData().getData(); // 獲取數據logger.info(new String(data));}});//3 開啟監聽,如果設置 true,則開啟監聽,加載緩沖數據nodeCache.start(true);// 防止虛擬機退出while(true){}}
NodeCache 會自動處理連接中斷和會話過期,并在重新連接后恢復監聽。可以通過 nodeCache.getCurrentData() 獲取當前節點數據。
PathChildrenCache
PathChildrenCache 監聽指定路徑下子節點的變化,包括子節點的添加、移除和更新事件。適用于需要監控目錄結構變化的場景。
tips: 監聽只會對子節點有效,對本節點無效。
/*** PathChildrenCache 監聽某個子節點的所有子節點(不含本節點)* @throws Exception*/@Testpublic void testPathChildrenCache() throws Exception{//1 創建PathChildrenCache對象PathChildrenCache nodeCache = new PathChildrenCache(client,"/app2",true);//2 注冊監聽nodeCache.getListenable().addListener(new PathChildrenCacheListener() {@Overridepublic void childEvent(CuratorFramework client, PathChildrenCacheEvent pathChildrenCacheEvent) throws Exception {logger.info("子節點變化");logger.info(JSONObject.toJSONString(pathChildrenCacheEvent));if(pathChildrenCacheEvent.getType().equals(PathChildrenCacheEvent.Type.CHILD_UPDATED)){ //子節點變化,打印數據byte[] data = pathChildrenCacheEvent.getData().getData();logger.info(new String(data));}}});//3 開啟監聽,如果設置 true,則開啟監聽,加載緩沖數據nodeCache.start();// 防止虛擬機退出while(true){}}
TreeCache
TreeCache 結合了 NodeCache 和 PathChildrenCache 的功能,可以監聽指定節點及其所有子節點的變化。適用于需要完整樹形結構監控的場景。
/*** TreeCache 監聽某個子節點自己和所有子節點, 相當于NodeCache和PathChildrenCache的組合* @throws Exception*/@Testpublic void testTreeCache() throws Exception{//1 創建TreeCache對象TreeCache nodeCache = new TreeCache(client,"/app2");//2 注冊監聽nodeCache.getListenable().addListener(new TreeCacheListener() {@Overridepublic void childEvent(CuratorFramework curatorFramework, TreeCacheEvent treeCacheEvent) throws Exception {logger.info("節點變化");logger.info(JSONObject.toJSONString(treeCacheEvent));if(treeCacheEvent.getType().equals(PathChildrenCacheEvent.Type.CHILD_UPDATED)){ //子節點變化,打印數據byte[] data = treeCacheEvent.getData().getData();logger.info(new String(data));}}});//3 開啟監聽,如果設置 true,則開啟監聽,加載緩沖數據nodeCache.start();// 防止虛擬機退出while(true){}}
TreeCache 提供的事件類型更豐富,包括 NODE_ADDED、NODE_UPDATED、NODE_REMOVED 等。可以獲取完整的節點樹結構變化信息。