Curator使用(二)

Curator 使用(二)

子節(jié)點查詢

List<String> childNodes = client.getChildren()
                           .forPath(nodePath);
System.out.println("開始打印子節(jié)點:");
for (String s : childNodes) {
   System.out.println(s);
}

判斷節(jié)點是否存在

// 判斷節(jié)點是否存在,如果不存在則為空
Stat statExist = client.checkExists().forPath(nodePath + "/abc");
System.out.println(statExist);

注冊 Watcher 事件

client.getData().usingWatcher(new MyCuratorWatcher()).forPath(nodePath);
client.getData().usingWatcher(new MyWatcher()).forPath(nodePath);

MyCuratorWatcher

import org.apache.curator.framework.api.CuratorWatcher;
import org.apache.zookeeper.WatchedEvent;

public class MyCuratorWatcher implements CuratorWatcher {
   @Override
   public void process(WatchedEvent event) throws Exception {
      System.out.println("觸發(fā) watcher,節(jié)點路徑為:" + event.getPath());
   }
}

MyWatcher

import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;

public class MyWatcher implements Watcher {
   @Override
   public void process(WatchedEvent event) {
      System.out.println("觸發(fā) watcher,節(jié)點路徑為:" + event.getPath());
   }
}

CuratorWatcherWatcher 的區(qū)別主要在于實現(xiàn)process方法時對于異常的處理。其中 CuratorWatcher 可以拋出異常。

注冊 Watcher 事件(注冊一次,監(jiān)聽多次)

// 為節(jié)點添加 watcher
// NodeCache: 監(jiān)聽數(shù)據(jù)節(jié)點的變更,會觸發(fā)事件
final NodeCache nodeCache = new NodeCache(cto.client, nodePath);

// buildInitial : 初始化的時候獲取 node 的值并且緩存
nodeCache.start(true);
if (nodeCache.getCurrentData() != null) {
   System.out.println("節(jié)點初始化數(shù)據(jù)為:" + new String(nodeCache.getCurrentData().getData()));
} else {
   System.out.println("節(jié)點初始化數(shù)據(jù)為空...");
}

nodeCache.getListenable().addListener(new NodeCacheListener() {
   public void nodeChanged() throws Exception {
      if (nodeCache.getCurrentData() == null) {
         System.out.println("空");
         return;
      }
      String data = new String(nodeCache.getCurrentData().getData());
      System.out.println("節(jié)點路徑:" + nodeCache.getCurrentData().getPath() + "數(shù)據(jù):" + data);
   }
});

刪除監(jiān)聽事件可以使用 nodeCache.getListenable().removeListener();

為子節(jié)點注冊 Watcher 事件

這種形式的好處在于可以監(jiān)聽節(jié)點的增刪改查操作的觸發(fā)。

// 為子節(jié)點添加 watcher
// PathChildrenCache: 監(jiān)聽數(shù)據(jù)節(jié)點的增刪改,會觸發(fā)事件
String childNodePathCache =  nodePath;
// cacheData: 設(shè)置緩存節(jié)點的數(shù)據(jù)狀態(tài)
final PathChildrenCache childrenCache = new PathChildrenCache(cto.client, childNodePathCache, true);
/**
 * StartMode: 初始化方式
 * POST_INITIALIZED_EVENT:異步初始化,初始化之后會觸發(fā)事件
 * NORMAL:異步初始化
 * BUILD_INITIAL_CACHE:同步初始化
 */
childrenCache.start(StartMode.POST_INITIALIZED_EVENT);

List<ChildData> childDataList = childrenCache.getCurrentData();
System.out.println("當前數(shù)據(jù)節(jié)點的子節(jié)點數(shù)據(jù)列表:");
for (ChildData cd : childDataList) {
   String childData = new String(cd.getData());
   System.out.println(childData);
}

childrenCache.getListenable().addListener(new PathChildrenCacheListener() {
   public void childEvent(CuratorFramework client, PathChildrenCacheEvent event) throws Exception {
      if(event.getType().equals(PathChildrenCacheEvent.Type.INITIALIZED)){
         System.out.println("子節(jié)點初始化 ok...");
      }

      else if(event.getType().equals(PathChildrenCacheEvent.Type.CHILD_ADDED)){
         String path = event.getData().getPath();
         if (path.equals(ADD_PATH)) {
            System.out.println("添加子節(jié)點:" + event.getData().getPath());
            System.out.println("子節(jié)點數(shù)據(jù):" + new String(event.getData().getData()));
         } else if (path.equals("/super/imooc/e")) {
            System.out.println("添加不正確...");
         }

      }else if(event.getType().equals(PathChildrenCacheEvent.Type.CHILD_REMOVED)){
         System.out.println("刪除子節(jié)點:" + event.getData().getPath());
      }else if(event.getType().equals(PathChildrenCacheEvent.Type.CHILD_UPDATED)){
         System.out.println("修改子節(jié)點路徑:" + event.getData().getPath());
         System.out.println("修改子節(jié)點數(shù)據(jù):" + new String(event.getData().getData()));
      }
   }
});
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容