Java API 操作Zookeeper
生活随笔
收集整理的這篇文章主要介紹了
Java API 操作Zookeeper
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
一、依賴
<dependency><groupId>org.apache.zookeeper</groupId><artifactId>zookeeper</artifactId><version>3.4.9</version><type>pom</type> </dependency>二、API介紹
1.創(chuàng)建會話
1) ZooKeeper(String connectString, int sessionTimeout, Watcher watcher) 2) ZooKeeper(String connectString, int sessionTimeout, Watcher watcher, boolean canBeReadOnly) 3) ZooKeeper(String connectString, int sessionTimeout, Watcher watcher, long sessionId, byte[] sessionPasswd) 4) ZooKeeper(String connectString, int sessionTimeout, Watcher watcher, long sessionId, byte[] sessionPasswd, boolean canBeReadOnly)客戶端與服務(wù)端回話的創(chuàng)建是一個(gè)異步的過程: 1) 完成客戶端的初始化就返回,此時(shí)連接并沒有真正的建立起來。 2) 當(dāng)連接真正建立后,客戶端會收到一個(gè)時(shí)間通知。ZK構(gòu)造方法參數(shù)說明
connectString:指zk的服務(wù)器列表,以英文輸入法下逗號分割的host:port,比如192.168.2.14:2181,192.168.1.15:2181 sessionTimeout:會話超時(shí)時(shí)間,單位是毫秒?當(dāng)在這個(gè)時(shí)間內(nèi)沒有收到心跳檢測,會話就會失效 watcher:注冊的watcher,null表示不設(shè)置 canBeReadOnly:用于標(biāo)識當(dāng)前會話是否支持"read-only"模式 sessionId:會話ID sessionPasswd:會話密鑰2.創(chuàng)建節(jié)點(diǎn)
#同步創(chuàng)建節(jié)點(diǎn) 1) String create(String path, byte[] data, List<ACL> acl, CreateMode createMode) #異步創(chuàng)建節(jié)點(diǎn) 2) void create(String path, byte[] data,List<ACL> acl, CreateMode createMode, AsyncCallback.StringCallback cb, Object ctx); 以上創(chuàng)建方法都不支持遞歸創(chuàng)建節(jié)點(diǎn),當(dāng)節(jié)點(diǎn)存在時(shí)拋出異常NodeExistsExceptionZK create api參數(shù)說明
path:被創(chuàng)建的節(jié)點(diǎn)路,比如:/zoo/tiger data[]:節(jié)點(diǎn)數(shù)據(jù) acl:Acl策略 createMode:節(jié)點(diǎn)類型,枚舉類型,有四種選擇持久 PERSISTEN持久順序 PERSISTENT_SEQUENTIAL臨時(shí) EPHEMERAL臨時(shí)順序 EPHEMERAL_SEQUENTIAL cb:異步回調(diào)函數(shù),需要實(shí)現(xiàn)StringCallback接口,當(dāng)服務(wù)端創(chuàng)建完成后,客戶端會自動調(diào)用這個(gè)對象的processResult方法 ctx:用于傳遞一個(gè)對象,可以在回調(diào)方法執(zhí)行的時(shí)候用,通常用于傳遞業(yè)務(wù)的上下文信息3.刪除節(jié)點(diǎn)
#同步刪除節(jié)點(diǎn) 1) void delete(String path, int version); #異步刪除節(jié)點(diǎn) 2) void delete(String path, int version, AsyncCallback.VoidCallback cb, Object ctx);ZK delete api參數(shù)說明
path:被刪除的節(jié)點(diǎn)路徑 version:知道節(jié)點(diǎn)的數(shù)據(jù)版本,如果指定的版本不是最新版本,將會報(bào)錯(cuò),它的作用類似于hibernate中的樂觀鎖 cb:異步回調(diào)函數(shù) ctx:上下文信息4.獲取子節(jié)點(diǎn)
#返回子節(jié)點(diǎn) 1) List<String> getChildren(String path, boolean watch) #返回子節(jié)點(diǎn)和stat 2) List<String> getChildren(String path, boolean watch, Stat stat) #異步方式返回子節(jié)點(diǎn),返回path指定節(jié)點(diǎn)的狀態(tài)信息(stat) 3) void getChildren(String path, boolean watch, AsyncCallback.Children2Callback cb, Object ctx) #異步方式返回子節(jié)點(diǎn),不返回path指定節(jié)點(diǎn)的狀態(tài)信息(stat) 4) void getChildren(String path, boolean watch, AsyncCallback.ChildrenCallback cb, Object ctx) 5) List<String> getChildren(String path, Watcher watcher) 6) List<String> getChildren(String path, Watcher watcher, Stat stat) 7) void getChildren(String path, Watcher watcher, AsyncCallback.Children2Callback cb, Object ctx) 8) void getChildren(String path, Watcher watcher, AsyncCallback.ChildrenCallback cb, Object ctx)ZK geChildren API參數(shù)說明
path:數(shù)據(jù)節(jié)點(diǎn)路徑 watcher:設(shè)置watcher后,如果path對應(yīng)節(jié)點(diǎn)的數(shù)據(jù)發(fā)生變化,將會得到通知,允許為null watch:是否使用默認(rèn)的watcher stat:指定數(shù)據(jù)節(jié)點(diǎn)的狀態(tài)信息 cb:異步回調(diào)函數(shù) ctx:上下文信息5.獲取節(jié)點(diǎn)數(shù)據(jù)
1) void getData(String path, boolean watch, AsyncCallback.DataCallback cb, Object ctx) 2) byte[] getData(String path, boolean watch, Stat stat) 3) void getData(String path, Watcher watcher, AsyncCallback.DataCallback cb, Object ctx) 4) byte[] getData(String path, Watcher watcher, Stat stat)ZK getData API參數(shù)說明
path:數(shù)據(jù)節(jié)點(diǎn)路徑 watcher:設(shè)置watcher后,如果path對應(yīng)節(jié)點(diǎn)的數(shù)據(jù)發(fā)生變化,將會得到通知,允許為null watch:是否使用默認(rèn)的watcher stat:指定數(shù)據(jù)節(jié)點(diǎn)的狀態(tài)信息 cb:異步回調(diào)函數(shù) ctx:上下文信息6.修改節(jié)點(diǎn)數(shù)據(jù)
1) Stat setData(String path, byte[] data, int version) 2) void setData(String path, byte[] data, int version, AsyncCallback.StatCallback cb, Object ctx)ZK setData API參數(shù)說明
path:被修改的節(jié)點(diǎn)路徑 data:新的數(shù)據(jù) version:版本,與上述功能一樣 cb:異步回調(diào)函數(shù) ctx:上下文信息7.檢測節(jié)點(diǎn)是否存在
1) Stat exists(String path, boolean watch) 2) void exists(String path, boolean watch, AsyncCallback.StatCallback cb, Object ctx) 3) Stat exists(String path, Watcher watcher) 4) void exists(String path, Watcher watcher, AsyncCallback.StatCallback cb, Object ctx)ZK exists API參數(shù)說明
path:數(shù)據(jù)節(jié)點(diǎn)路徑 watcher:注冊的watcher,用于監(jiān)聽三個(gè)事件節(jié)點(diǎn)被創(chuàng)建節(jié)點(diǎn)被刪除節(jié)點(diǎn)被更新 watch:是否使用默認(rèn)watcher cb:異步回調(diào)函數(shù) ctx:上下文信息三、編碼
public class ZookeeperTest {private static final String URL = "192.168.2.14:2181";private ZooKeeper zk;@Beforepublic void setUp() throws Exception {zk = new ZooKeeper(URL, 20000, new Watcher() {// 監(jiān)控所有被觸發(fā)的事件@Overridepublic void process(WatchedEvent event) {System.out.println("已經(jīng)觸發(fā)了" + event.getType() + "事件!");}});}// 創(chuàng)建目錄節(jié)點(diǎn)@Testpublic void createNode() throws Exception {zk.create("/zkRoot", "10086".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);}// 創(chuàng)建子節(jié)點(diǎn)@Testpublic void createChildNode() {try {zk.create("/zkRoot/zkChild", "1008611".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);} catch (KeeperException e) {e.printStackTrace();} catch (InterruptedException e) {e.printStackTrace();}}// 顯示節(jié)點(diǎn)列表@Testpublic void listNodes() throws Exception {List<String> children = zk.getChildren("/", true);System.out.println(children);}// 獲取節(jié)點(diǎn)@Testpublic void getNode() throws Exception {System.out.println(new String(zk.getData("/zkRoot/zkChild", true, null)));}// 修改節(jié)點(diǎn)信息@Testpublic void updateNode() throws Exception {// version為-1則忽略版本檢查zk.setData("/zkRoot/zkChild", "1008612".getBytes(), -1);}// 刪除節(jié)點(diǎn)@Testpublic void deleteNode() {// version為-1則忽略版本檢查try {zk.delete("/zkRoot/zkChild", -1);} catch (InterruptedException e) {e.printStackTrace();} catch (KeeperException e) {e.printStackTrace();}}// 查看節(jié)點(diǎn)狀態(tài)@Testpublic void showStatus() throws Exception {Stat rt = zk.exists("/zkRoot/zkChild", true);if (rt != null) {System.out.println(rt);} else {System.out.println("節(jié)點(diǎn)不存在");}}@Afterpublic void tearDown() throws Exception {zk.close();}}四、Watch機(jī)制
1) 客戶端向zk服務(wù)器注冊watcher的同時(shí),會將watcher對象存儲在客戶端的watchManger中。 2) zk服務(wù)器觸發(fā)watcher事件后,會向客戶端發(fā)送通知,客戶端線程從watchManger中調(diào)用watcher執(zhí)行。重要說明:watch設(shè)置后,一旦觸發(fā)一次立即會失效,如果需要一直監(jiān)聽,需要再次注冊!!!
轉(zhuǎn)載于:https://www.cnblogs.com/moonlightL/p/7404648.html
總結(jié)
以上是生活随笔為你收集整理的Java API 操作Zookeeper的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基础回顾之集合框架
- 下一篇: (转载)HTTP与RPC的区别