1. 程式人生 > >Zookeeper客戶端API之讀取子節點列表(八)

Zookeeper客戶端API之讀取子節點列表(八)

本篇部落格介紹一下Zookeeper原生客戶端API提供的獲取子節點列表方法。

獲取子節點列表方法

方法

Zookeeper原生客戶端API提供了以下8中獲取子節點列表的方法,每個方法的使用說明參考註釋內容:

/**
 * 返回指定路徑下面的子節點列表。
 * 如果watcher不為null,並且呼叫成功(沒有異常),會將watcher註冊在指定的path
 * 上。當path(父節點)被刪除或者path下面建立/刪除子節點,將觸發通知watcher。
 * 
 * 返回結果列表不保證有序性。
 */
public List<String> getChildren(final
String path, Watcher watcher)
/**
 * 使用說明同上一個方法。
 */
public List<String> getChildren(String path, boolean watch)
/**
 * getChildren(String, Watcher)的非同步版本
 */
public void getChildren(final String path, Watcher watcher,
            ChildrenCallback cb, Object ctx)
/**
 * getChildren(String, boolean)的非同步版本
 */
public void getChildren(String path, boolean watch, ChildrenCallback cb, Object ctx)
/**
 * 為指定的路徑返回stat和子節點列表。
 * 
 */
public List<String> getChildren(final String path, Watcher watcher,
            Stat stat)
/**
 * 使用說明同上一個方法。
 */
public List<String> getChildren(String path, boolean
watch, Stat stat)
/**
 * getChildren(String, Watcher, Stat)的非同步版本
 */
public void getChildren(final String path, Watcher watcher,
            Children2Callback cb, Object ctx)
/**
 * getChildren(String, boolean, Stat)的非同步版本
 */
public void getChildren(String path, boolean watch, Children2Callback cb,
            Object ctx)

引數說明

引數名 說明
path 指定資料節點的路徑,獲取該節點下面的子節點
watcher 註冊在path上的Watcher。path被刪除或者path下面的建立/刪除節點,向客戶端傳送通知。可為null
watch 表示是否需要註冊一個watcher。true:註冊預設watcher,false:不需要註冊watcher
cb 註冊一個非同步的回撥函式
ctx 使用者傳遞資訊
stat 指定資料節點狀態資訊。傳入舊stat,方法執行過程中會將其替換為新stat物件。

具體案例

package com.secbro.learn;

import org.apache.zookeeper.*;

import java.util.List;
import java.util.concurrent.CountDownLatch;

/**
 * 獲得子節點列表的方法
 * Created by zhuzs on 2017/3/26.
 */
public class TestGetChildrenMethod implements Watcher {

    private static CountDownLatch countDownLatch = new CountDownLatch(1);

    private static ZooKeeper zooKeeper;
    public static void main(String[] args) throws Exception {
        zooKeeper = new ZooKeeper("127.0.0.1:2181", 5000, new TestGetChildrenMethod());
        countDownLatch.await();

        // 建立父節點/test
        zooKeeper.create("/test", "123".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
        // 在父節點/test下面建立a1節點
        zooKeeper.create("/test/a1", "456".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);

        // 同步獲得結果
        List<String> childrenList = zooKeeper.getChildren("/test", true);
        System.out.println("同步getChildren獲得資料結果:" + childrenList);

        // 非同步獲得結果
        zooKeeper.getChildren("/test",true,new MyChildren2Callback(),null);

        // 在父節點/test下面建立a2節點
        zooKeeper.create("/test/a2", "456".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);

        Thread.sleep(10000);

    }

    public void process(WatchedEvent event) {
        if (Event.KeeperState.SyncConnected == event.getState()) {
            if(Event.EventType.None == event.getType() && null == event.getPath()){ // 連線時的監聽事件
                countDownLatch.countDown();
            } else if (event.getType() == Event.EventType.NodeChildrenChanged){ // 子節點變更時的監聽
                try {
                    System.out.println("重新獲得Children,並註冊監聽:" + zooKeeper.getChildren(event.getPath(),true));
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
class MyChildren2Callback implements AsyncCallback.Children2Callback{

    public void processResult(int rc, String path, Object ctx, List<String> children, Stat stat) {
        System.out.println("非同步獲得getChildren結果,rc=" + rc
                + ";path=" + path + ";ctx=" + ctx + ";children=" + children +";stat=" + stat);
    }
}

輸出結果:

同步getChildren獲得資料結果:[a1]
非同步獲得getChildren結果,rc=0;path=/test;ctx=null;children=[a1];stat=14277,14277,1490498559704,1490498559704,0,1,0,0,3,1,14278

重新獲得Children,並註冊監聽:[a1, a2]

上面的例子,先建立了一個父節點test,然後在其下面建立了a1子節點,並註冊監聽。當父節點test下面建立了新的a2子節點之後,監聽事件觸發。但此時需要重新主動獲取該父節點下面的子節點,並繼續註冊監聽事件。

上面只提供了新增子節點的案例,其實刪除子節點或刪除父節點同樣會觸發監聽事件。

相關推薦

Zookeeper客戶API讀取節點列表

本篇部落格介紹一下Zookeeper原生客戶端API提供的獲取子節點列表方法。 獲取子節點列表方法 方法 Zookeeper原生客戶端API提供了以下8中獲取子節點列表的方法,每個方法的使用說明參考註釋內容: /** * 返回指定路徑下面的子節點列

Zookeeper客戶API讀取節點內容

本篇部落格介紹一下Zookeeper原聲API讀取節點內容的使用方法。 讀取節點內容方法介紹 方法 Zookeeper提供了兩個方法來獲取節點內容,同步獲取和非同步獲取: public byte[] getData(String path,

Zookeeper客戶API修改刪除節點

上篇部落格《Zookeeper客戶端API之讀取子節點內容(九)》我們介紹了Zookeeper獲得節點內容的方法使用,其中例項程式碼中已經用到了修改節點內容的方法。因此,本篇部落格只介紹修改和刪除功能A

Zookeeper客戶API建立會話

Zookeeper對外提供了一套Java的客戶端API。本篇部落格主要講一下建立會話。 建立專案 首選,建立一個基於maven管理的簡單java工程。在pom檔案中引入zookeeper。 <dependency> <group

ZooKeeperJava客戶API使用—讀取資料。

        讀取資料,包括子節點列表的獲取和節點資料的獲取。ZooKeeper分別提供了不同的API來獲取資料。 getChildren         客戶端可以通過ZooKeeper的API來獲取一個節點的所有子節點,有如下8個介面可供使用: List<Str

zookeeper客戶api操作

這裡記錄zookeeper java客戶端api的使用。 客戶端建立Zookeeper例項,然後呼叫這個類提供的方法與zookeeper伺服器進行互動。 Zookeeper的建構函式有如下4種: ZooKeeper(connectString, sessionT

zookeeper客戶使用原生JavaApi操作節點

開發 vat closed 路徑 就是 list disco override () 1.引入依賴 <dependency> <groupId>org.apache.zookeeper</groupId>

OPC工作記錄整理——第四篇OPC客戶開發OPC伺服器的列舉和連線

    OPC客戶端的開發相對來說,只要掌握了OPC基類的幾個介面,並知道它們是如何運作的,那麼開發起來還是相對容易的。好了,廢話不多說了,我們開始吧。     首先是對標頭檔案的引用: #include "stdafx.h" #include <afxcoll.h

【python-excel】Selenium+python自動化讀取Excel數據xlrd

logs title .html selenium2 ref target targe pos 數據 Selenium2+python自動化之讀取Excel數據(xlrd) 轉載地址:http://www.cnblogs.com/lingzeng86/p/6793398.h

SCCM 2016 為客戶分發管理組件Configuration Manager

sccm2016 configuration manag 上篇文章我們通過不同的發現方式,來掃描和發現當前需要管控的計算機客戶端。但是如此多種類和多操作系統的客戶端,我們如何來將他們進行分類和管理呢?接下來我們就來給他們劃分一下類別。SCCM是通過“設備集”來進行分類。我們右鍵,創建一個“設備集”輸入

SCCM 2016 為客戶分發管理組件Configuration Manager

sccm2016 configuration manag 上面我們完成了一個設備集的創建。接下來我們再創建一個設備集,叫做“未安裝客戶端的計算機”,這樣可以有效的篩選出一些遺漏或者新增的客戶端計算機。首先和之前一樣,右鍵創建“設備集”給這個設備集填寫名字,並選擇“限制集合”的範圍還是選成“所有系統”接

客戶瀏覽器傳送壓縮後的資料gzip

當向客戶端瀏覽器傳送一個較大的Html頁面或者大的檔案時,會佔用較大的網路頻寬,使得客戶端的響應速度下降。使用壓縮方式,將大的檔案先壓縮,然後再發送,可以降低網路的頻寬。 當向客戶端瀏覽器傳送資料時,大致傳輸過程如下: 函式介紹: st

在VMware vSphere Client客戶中新建主機的虛擬機器詳細

接上一篇,現在我們已經上傳了linux映象檔案到主機上,接下來是建立虛擬機器並安裝系統了。 首先,在主機上新建虛擬機器 選擇典型 為虛擬機器命名 選擇預設儲存器,點選下一步 作

android客戶首次進入輪播引導圖

剩下的就是邏輯程式碼了,先貼出來: package com.fanyafeng.recreation.activity; import android.content.Intent; import android.content.pm.FeatureGr

Android客戶首次啟動時的引導介面viewpager

剛做完一個比賽專案,來寫點以後能用著的東西–Android客戶端的首次啟動頁面,而且這個以後複用的機率很大,也不怎麼修改,特留下為以後準備,同時為初學者提供一個幫助。 實現思路是:用SharedPreferences儲存一個首次登陸的資訊,預設是true,進入

使用 AIDL 實現客戶和服務的程序間通訊IPC

1. 使用步驟 AIDL 的意思是 Android 介面定義語言。利用它來定義程序間通訊時雙方認可的程式設計介面。 第一步:建立 .aidl 檔案 AIDL 介面方法中支援的引數型別: 8 個基本資料型別 String CharSequence Lis

Android客戶效能測試—CPU、啟動時間

前言: 1.繼上篇“記憶體”,這篇講述的是“CPU”和“啟動時間” 2.準備工作,及如何獲取程序PID,請參見上篇文章 一、查取android手機的整體CPU利用率 1、top命令 (1).開啟cmd命令進入adb shell 環境 (2).輸入 top -n 1 -

機器學習numpy和matplotlib學習

今天來學習第四種畫子圖的方法。 也就是plt.subplots( ).注意區別於plt.subplot( )函式。 先來看看程式碼: #!/usr/bin/env python # -*- coding: utf-8 -*- # @Author : SundayCoder-俊勇

各種音視訊編解碼學習詳解 編解碼學習筆記:Real系列

     最近在研究音視訊編解碼這一塊兒,看到@bitbit大神寫的【各種音視訊編解碼學習詳解】這篇文章,非常感謝,佩服的五體投地。奈何大神這邊文章太長,在這裡我把它分解成很多小的篇幅,方便閱讀。大神部落格傳送門:https://www.cnblogs.com/skyo

《Linux系統》"皮毛系列"Vim/Vi的簡介及使用

一、Vim/Vi的簡介 1、為什麼要學習Vim/Vi 世界上的文字編輯器(含程式碼編輯器)的種類多不勝數,他們各有各的優點,在功能設計上也很強大,視覺化介面上也越做越好看,既然有那麼多的編輯器,我們為什麼還要學習Vim/Vi呢。我來說一下原因: 1、所有的類Unix系統,都自帶v