curator 監(jiān)聽器介紹

監(jiān)聽器前言

  1. 本人使用 curator 版本 5+ ,對此版本的監(jiān)聽器做一下小結(jié)
  2. 網(wǎng)上搜索 Zookeeper 的 curator 監(jiān)聽器,大概率會出現(xiàn)一下 3 種監(jiān)聽器
    • NodeCache :只是監(jiān)聽某一特定節(jié)點(diǎn)的數(shù)據(jù)更新、新增、刪除
      1. 節(jié)點(diǎn)不存在也可以添加監(jiān)聽器
    • PathChildrenCache :監(jiān)聽節(jié)點(diǎn)的子節(jié)點(diǎn)。當(dāng)子節(jié)點(diǎn)增加、更新、刪除時,PathCache 會改變它的狀態(tài)。保存子節(jié)點(diǎn),數(shù)據(jù)、狀態(tài)
    • TreeCache
  3. 使用 curator 版本 5+ 時,發(fā)現(xiàn)這些監(jiān)聽器已被棄用,所以使用以下幾種監(jiān)聽器
  4. curator 注冊的監(jiān)聽器,不需要考慮 一次性問題

監(jiān)聽器-1

  1. 可以監(jiān)聽當(dāng)前節(jié)點(diǎn)和子節(jié)點(diǎn)(子節(jié)點(diǎn)的子節(jié)點(diǎn))的創(chuàng)建、更新、刪除

    • 事件

      NODE_CREATED // 節(jié)點(diǎn)創(chuàng)建
      NODE_CHANGED // 節(jié)點(diǎn)更新
      NODE_DELETED // 節(jié)點(diǎn)刪除
      
    • NODE_CREATEE 事件,節(jié)點(diǎn)創(chuàng)建會被觸發(fā);監(jiān)聽器第一次執(zhí)行時節(jié)點(diǎn)存在也會觸發(fā)次事件

  2. 使用實例介紹

    • 如下

      CuratorCache curatorCache = CuratorCache.build(client, "/watcher");
      curatorCache.listenable().addListener(new CuratorCacheListener() {
          @Override
          public void event(Type type, ChildData childData, ChildData childData1) {
              if (type.name().equals("NODE_CREATED")) {
                  //--節(jié)點(diǎn)創(chuàng)建--//
                  //--第二個參數(shù)為null--//
              } else if (type.name().equals("NODE_CHANGED")) {
                  //--更新--//
                  //--節(jié)點(diǎn)第一次賦值,childrenData.getData()為null--//
              } else {
                  //--刪除--//
                  //--第三個參數(shù)為null--//
              }
          }
      });
      //--開啟監(jiān)聽器--//
      curatorCache.start();
      //--關(guān)閉監(jiān)視器--//
      //curatorCache.close();
      
  3. Type type 對象是枚舉類型

    • 監(jiān)聽事件為:創(chuàng)建、更新、刪除

    • 源碼如下

      public static enum Type {
          NODE_CREATED,
          NODE_CHANGED,
          NODE_DELETED;
      
          private Type() {
          }
      }
      
  4. 回調(diào)函數(shù)參數(shù) public void event(Type type, ChildData childData, ChildData childData1)

    • 第一個參數(shù):事件類型(枚舉)
    • 第二個參數(shù):節(jié)點(diǎn)更新前的狀態(tài)、數(shù)據(jù)
    • 第三個參數(shù):節(jié)點(diǎn)更新后的狀態(tài)、數(shù)據(jù)
  5. 回調(diào)函數(shù)使用注意

    • 創(chuàng)建節(jié)點(diǎn)時:節(jié)點(diǎn)剛被創(chuàng)建,不存在 更新前節(jié)點(diǎn) ,所以第二個參數(shù)為 null
    • 刪除節(jié)點(diǎn)時:節(jié)點(diǎn)被刪除,不存在 更新后節(jié)點(diǎn) ,所以第三個參數(shù)為 null
    • 節(jié)點(diǎn)創(chuàng)建時沒有賦予值 create /curator/watcher 只創(chuàng)建節(jié)點(diǎn),在這種情況下,更新前節(jié)點(diǎn)data 為 null,獲取不到更新前節(jié)點(diǎn)的數(shù)據(jù)
  6. 使用案例

    • 如下

      CuratorCache curatorCache = CuratorCache.build(client, "/watcher");
      curatorCache.listenable().addListener(new CuratorCacheListener() {
          @Override
          public void event(Type type, ChildData childData, ChildData childData1) {
              if (type.name().equals("NODE_CREATED")) {
                  System.out.println(childData1.getPath() + " 節(jié)點(diǎn)被創(chuàng)建");
              } else if (type.name().equals("NODE_CHANGED")) {
                  System.out.println(type.name() + " 節(jié)點(diǎn)數(shù)據(jù)修改");
                  System.out.println(childData.getPath());
                  if (childData.getData() != null) {
                      System.out.println("修改之前數(shù)據(jù)" + new String(childData.getData()));
                  } else {
                      System.out.println("節(jié)點(diǎn)第一次賦值");
                  }
                  System.out.println("修改之后數(shù)據(jù)" + new String(childData1.getData()));
              } else {
                  System.out.println(childData.getPath() + " 節(jié)點(diǎn)刪除");
                  System.out.println(new String(childData.getData()));
              }
          }
      });
      curatorCache.start();
      

監(jiān)聽器-2

待續(xù)……

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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