Zookeeper的api的簡單使用(轉載)

轉載自: http://www.cnblogs.com/sunddenly/p/4031881.html

1.API

zk

?

2.API 示例

ZooKeeper中的組成員關系

理解ZooKeeper的一種方法就是將其看作一個具有高可用性的文件系統。但這個文件系統中沒有文件和目錄,而是統一使用“節點”(node)的概念,稱為znode。znode既可以作為保存數據的容器(如同文件),也可以作為保存其他znode的容器(如同目錄)。所有的znode構成一個層次化的命名空間。一種自然的建立組成員列表的方式就是利用這種層次結構,創建一個以組名為節點名的znode作為父節點,然后以組成員名(服務器名)為節點名來創建作為子節點的znode。如下圖給出了一組具有層次結構的znode。

?

創建組示例代碼:

package org.zk;import java.io.IOException;
import java.util.concurrent.CountDownLatch;import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.Watcher.Event.KeeperState;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.ZooKeeper;public class CreateGroup implements{private static final int SESSION_TIMEOUT=5000;private ZooKeeper zk;private CountDownLatch connectedSignal=new CountDownLatch(1);@Overridepublic void(WatchedEvent event) {if(event.getState()==KeeperState.SyncConnected){connectedSignal.countDown();}}public static void main(String[] args) throws IOException, InterruptedException, KeeperException {CreateGroup createGroup = new CreateGroup();createGroup.connect(args[0]);createGroup.create(args[1]);createGroup.close();}private void close() throws InterruptedException {zk.close();}private void create(String groupName) throws KeeperException, InterruptedException {String path="/"+groupName;if(zk.exists(path, false)== null){}System.out.println("Created:"+path);} private void connect(String hosts) throws IOException, InterruptedException {zk = new ZooKeeper(hosts, SESSION_TIMEOUT, this);connectedSignal.await();}
}

?

代碼分析

在上面代碼中,main()方法執行時,創建了一個CreateGroup實例并且調用了這個實例的connect()方法。connect方法實例化了一個新的ZooKeeper類的對象,這個類是客戶端API中的主要類,并且負責維護客戶端和ZooKeeper服務之間的連接。ZooKeeper類的構造函數有三個參數:


  第一個是:ZooKeeper服務的主機地址,可指定端口,默認端口是2181。
  第二個是:以毫秒為單位的會話超時參數,這里我們設成5秒。
  第三個是:參數是一個Watcher對象的實例。

?

Watcher對象接收來自于ZooKeeper的回調,以獲得各種事件的通知。在這個例子中,CreateGroup是一個Watcher對象,因此我們將它傳遞給ZooKeeper的構造函數。
當一個ZooKeeper的實例被創建時,會啟動一個線程連接到ZooKeeper服務。由于對構造函數的調用是立即返回的,因此在使用新建的ZooKeeper對象之前一定要等待其與ZooKeeper服務之間的連接建立成功。我們使用Java的CountDownLatch類來阻止使用新建的ZooKeeper對象,直到這個ZooKeeper對象已經準備就緒。這就是Watcher類的
用途,在它的接口中只有一個方法:
public void process(WatcherEvent event);
客戶端已經與ZooKeeper建立連接后,Watcher的process()方法會被調用,參數是一個表示該連接的事件。在接收到一個連接事件(由 Watcher.Event.KeeperState的枚舉型值SyncConnected來表示)時,我們通過調用CountDownLatch的countDown()方法來遞減它的計數器。鎖存器(latch)被創建時帶有一個值為1的計數器,用于表示在它釋放所有等待線程之前需要發生的事件數。在調用一歡countDown()方法之后,計數器的值變為0,則await()方法返回。
現在connect()方法已經返回,下一個執行的是CreateGroup的create()方法。在這個方法中,我們使用ZooKeeper實例中的create()方法來創建一個新的ZooKeeper的znode。所需的參數包括

路徑:用字符串表示。
znode的內容:字節數組,本例中使用空值。
訪問控制列表:簡稱ACL,本例中使用了完全開放的ACL,允許任何客戶端對znode進行讀寫。

創建znode的類型:有兩種類型的znode:短暫的和持久的。

創建znode的客戶端斷開連接時,無論客戶端是明確斷開還是因為任何原因而終止,短暫znode都會被ZooKeeper服務刪除。與之相反,當客戶端斷開連接時,持久znode不會被刪除。我們希望代表一個組的znode存活的時間應當比創建程序的生命周期要長,因此在本例中我們創建了一個持久的znode。

create()方法的返回值是ZooKeeper所創建的路徑,我們用這個返回值來打印一條表示路徑成功創建的消息。當我們查看“順序znode”(sequential znode)時.會發現create()方法返回的路徑與傳遞給該方法的路徑不同。

?

加入組

package org.zk;import java.io.IOException;import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.ZooDefs.Ids;public class JoinGroup extends ConnectionWatcher{public void join(String groupName,String memberName) throws KeeperException, InterruptedException{;String createdPath=zk.(path, null, Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);System.out.println("Created:"+createdPath);}public static void main(String[] args) throws InterruptedException, IOException, KeeperException {JoinGroup joinGroup = new JoinGroup();joinGroup.connect(args[0]);joinGroup.join(args[1], args[2]);//stay alive until process is killed or thread is interrupted
        Thread.sleep(Long.MAX_VALUE);}
}

列出組成員

package org.zk;import java.io.IOException;
import java.util.List;import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.ZooKeeper;public class ListGroup extends ConnectionWatcher {public void list(String groupNmae) throws KeeperException, InterruptedException{String path ="/"+groupNmae;try {List<String> children = (path, false);if(children.isEmpty()){System.out.printf("No memebers in group %s\n",groupNmae);System.exit(1);}for(){System.out.println(child);}} catch (KeeperException.NoNodeException e) {System.out.printf("Group %s does not exist \n", groupNmae);System.exit(1);} }public static void main(String[] args) throws IOException, InterruptedException, KeeperException {ListGroup listGroup = new ListGroup();listGroup.connect(args[0]);listGroup.list(args[1]);listGroup.close();}
}

刪除組

下面來看如何刪除一個組。ZooKeeper類提供了一個delete()方法,該方法有兩個參數:

1. 路徑

2. 版本號

如果所提供的版本號與znode的版本號一致,ZooKeeper會刪除這個znode。這是一種樂觀的加鎖機制,使客戶端能夠檢測出對znode的修改沖突。通過將版本號設置為-1,可以繞過這個版本檢測機制,不管znode的版本號是什么而直接將其刪除。ZooKeeper不支持遞歸的刪除操作,因此在刪除父節點之前必須先刪除子節點。

在代碼3.5中,DeleteGroup類用于刪除一個組及其所有成員。
代碼3.5用于刪除一個組及其所有成員的程序

package org.zk;import java.io.IOException;
import java.util.List;import org.apache.zookeeper.KeeperException;public class DeleteGroup extends ConnectionWatcher{public void delete(String groupName) throws InterruptedException, KeeperException{String path="/"+groupName;List<String> children;try {children = (path, false);for(String child:children){            }zk.delete(path, -1);} catch (KeeperException.NoNodeException e) {System.out.printf("Group %s does not exist\n", groupName);System.exit(1);}    }public static void main(String[] args) throws InterruptedException, IOException, KeeperException {DeleteGroup deleteGroup = new DeleteGroup();deleteGroup.connect(args[0]);deleteGroup.delete(args[1]);deleteGroup.close();}
}

轉載于:https://www.cnblogs.com/chenyansong/p/5529670.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/395883.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/395883.shtml
英文地址,請注明出處:http://en.pswp.cn/news/395883.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

必須使用301重定向的運用場景

必須使用301重定向的運用場景

1.1好素數

題目 題意&#xff1a;一個好素數的定義是&#xff0c;他是一個素數&#xff0c;然后他的左右兩邊10區間內存在素數&#xff0c;那么他就是好素數&#xff0c;現在讓你輸入一個數字&#xff0c;這個數字以內的好素數的數量。 解題方法&#xff1a;先把每一個數字是不是素數判斷…

jquery.vue.js_一個Vue.js簡介,面向只了解jQuery的人

jquery.vue.jsby Matt Rothenberg馬特羅森伯格(Matt Rothenberg) 一個Vue.js簡介&#xff0c;面向只了解jQuery的人 (A Vue.js introduction for people who know just enough jQuery to get by) I’ve had a love-hate relationship with JavaScript for years.我與JavaScrip…

python 矩陣獲取行數_4個最佳項目創意的代碼片段和示例,旨在為Python和機器學習構建出色的簡歷!...

點擊上方“小白學視覺”&#xff0c;選擇加"星標"或“置頂”重磅干貨&#xff0c;第一時間送達一篇文章帶你了解4個最佳項目創意的代碼片段和示例Python是一種特殊的編程語言&#xff0c;適用于從初學者到中級用戶。由于它的靈活性&#xff0c;它正逐漸成為一種非常流…

Android 多狀態加載布局的開發 Tips

2019獨角獸企業重金招聘Python工程師標準>>> 什么是多狀態 Layout 對于大多數 App 而言&#xff0c;項目中都有多狀態加載 View 這種需求&#xff0c;如下圖所示。 對應到開發中&#xff0c;我們通常會開發一個對應的自定義 layout 用于根據頁面不同的狀態來顯示不同…

XML解析之JAXP案例詳解

根據一個CRUD的案例&#xff0c;對JAXP解析xml技術&#xff0c;進行詳細的解釋&#xff1a; 首先&#xff0c;已知一個xml文件中的數據如下&#xff1a; <?xml version"1.0" encoding"UTF-8" standalone"no"?> <書架><書 出版社…

隨機梯度下降

1.SGD 代價函數通常可以分解成每個樣本的代價函數的總和轉載于:https://www.cnblogs.com/bigcome/p/10042800.html

iis mysql5.7_手動配置網站環境 IIS 10+PHP 7.1+MySQL 5.7

之前配置環境一直用的一鍵安裝包&#xff0c;不管是phpStudy還是lnmp&#xff0c;昨天嘗試在自己電腦配置一下iis的環境&#xff0c;也踩了一些坑&#xff0c;整理了一下。測試電腦是Windows10&#xff0c;理論上Win7和IIS7.5都支持的。安裝 IIS1&#xff1a;控制面板 > 程序…

如何使用Apache的Prediction IO Machine Learning Server構建推薦引擎

by Vaghawan Ojha通過瓦哈萬歐哈(Vaghawan Ojha) 如何使用Apache的Prediction IO Machine Learning Server構建推薦引擎 (How to build a recommendation engine using Apache’s Prediction IO Machine Learning Server) This post will guide you through installing Apache…

JavaScript DOM編程藝術第二版學習(1/4)

接下來項目需要網頁相關知識&#xff0c;故在大牛的指引下前來閱讀本書。 記錄方式&#xff1a;本書分四部分閱讀&#xff0c;完成閱讀之后會多寫一篇包括思維導圖的算是閱讀指南的東西&#xff0c;瀏覽的童鞋看著指南可以跳過一些不必要的坑~ 當前水平&#xff1a;HTML&CS…

github開源大項目_GitHub剛剛發布了一份大規模的開源指南

github開源大項目Here are three links worth your time:這是三個值得您花費時間的鏈接&#xff1a; GitHub just released a massive guide to contributing to open source (5 to 60 minute read) GitHub剛剛發布了一份有關開源的大型指南( 閱讀5至60分鐘 ) A new way to br…

mysql中where條件判斷語句_MySQL Where 條件語句介紹和運算符小結

WHERE 條件有時候操作數據庫時&#xff0c;只操作一些有條件限制的數據&#xff0c;這時可以在SQL語句中添加WHERE子句來規定數據操作的條件。語法&#xff1a;SELECT column,… FROM tb_name WHERE definitionWHERE 關鍵字后面接有效的表達式(definition)&#xff0c;該表達式…

node webkit(nw.js) 設置自動更新

原理&#xff1a;把更新的文件放在服務器上&#xff0c;設置一個客戶端版本號&#xff0c;每次打開客戶端的時候&#xff0c;通過接口獲取服務器上的版本&#xff0c;如果高于本地的版本就下載服務器上的代碼&#xff0c;低于或等于就不更新 1 <script>2 var htt…

個人工作總結04(沖刺二)

今天是團隊第二次沖刺階段開始的第04天&#xff0c;我的工作總結如下&#xff1a; 一、昨天干了什么&#xff1f; 知識圈查詢功能 基本實現數據庫查詢 (未完成) 二、今天準備做什么&#xff1f; 知識圈查詢功能 基本實現數據庫查詢 三、遇到了什么困難&#xff1f; 數據庫訪問出…

mysql8.0版1130_navicat premium連接mysql 8.0報錯error 10061和error1130問題

昨天安裝了最新版的mysql navicat premium, 但沒來得及測試使用Navicat連接。今天上班時&#xff0c;使用Navicat premium連接mysql時&#xff0c;出現報錯ERROR 2003 (HY000): Can’t connect to MySQL server on ‘1XX.XX.XX.XX’ (10061).起初以為是mysql沒有安裝成功&#…

freecodecamp_為什么您一定要參與freeCodeCamp的一個研究小組

freecodecampby Frederick Ige弗雷德里克艾格(Frederick Ige) 為什么您一定要參與freeCodeCamp的一個研究小組 (Why you should definitely get involved with one of freeCodeCamp’s study groups) I’m writing this article in hopes of convincing you to take advantage…

C語言運行時數據結構

段&#xff08;Segment&#xff09;&#xff1a; 對象文件/可執行文件&#xff1a; SVr4 UNIX上被稱為ELF&#xff08;起初"Extensible Linker Format", 現在"Executable and Linking Format"&#xff09;文件。BSD UNIX上被稱為a.out。這些格式都具有段的…

Java掛起線程

2019獨角獸企業重金招聘Python工程師標準>>> 不優雅的suspend import java.util.concurrent.TimeUnit;public class SuspendTest {static Object lock new Object();SuppressWarnings("deprecation")public static void main(String[] args) {Suspend s1…

Hibernate包及相關工具包下載地址

Hibernate包及相關工具包下載地址&#xff1a; http://prdownloads.sourceforge.net/hibernate/ 這里包含所有hibernate各個版本的包下載&#xff0c;且提供了 Middlegen Hibernate及hibernate-extensions包的下載。這兩個包是用于自動生成相就的JAVA和*.hb…

init(coder:)_2018年《 New Coder》調查:31,000人告訴我們他們如何學習編碼并在工作中獲得工作…

init(coder:)More than 31,000 people responded to our 2018 New Coder Survey, granting researchers an unprecedented glimpse into how adults are learning to code.超過31,000人對我們的2018年《新編碼器調查》做出了回應&#xff0c;使研究人員對成年人如何學習編碼有了…