java連接zookeeper的3種方式小結(jié)
java連接zookeeper3種方式
1、使用zookeeper原始api
public class Demo {
private static String ip = "192.168.0.101:2181";
private static int session_timeout = 40000;
private static CountDownLatch latch = new CountDownLatch(1);
public static void main(String[] args) throws Exception {
ZooKeeper zooKeeper = new ZooKeeper(ip, session_timeout, new Watcher() {
@Override
public void process(WatchedEvent watchedEvent) {
if(watchedEvent.getState() == Event.KeeperState.SyncConnected) {
//確認(rèn)已經(jīng)連接完畢后再進(jìn)行操作
latch.countDown();
System.out.println("已經(jīng)獲得了連接");
}
}
});
//連接完成之前先等待
latch.await();
ZooKeeper.States states = zooKeeper.getState();
System.out.println(states);
}
}
打印:

如果打印出來的狀態(tài)為 CONNECTED 則表示連接成功
2、使用ZkClient客戶端連接,這種連接比較簡(jiǎn)單
public class ZkClientTest {
private static String ip = "192.168.0.101:2181";
private static int session_timeout = 40000;
public static void main(String[] args) {
ZkClient zkClient = new ZkClient(ip,session_timeout);
System.out.println(zkClient.getChildren("/"));
}
}
打?。?/strong>

3、使用curator連接
public class CuratorDemo {
//ZooKeeper服務(wù)地址
private static final String SERVER = "192.168.0.101:2181";
//會(huì)話超時(shí)時(shí)間
private static final int SESSION_TIMEOUT = 30000;
//連接超時(shí)時(shí)間
private static final int CONNECTION_TIMEOUT = 5000;
/**
* baseSleepTimeMs:初始的重試等待時(shí)間
* maxRetries:最多重試次數(shù)
*
*
* ExponentialBackoffRetry:重試一定次數(shù),每次重試時(shí)間依次遞增
* RetryNTimes:重試N次
* RetryOneTime:重試一次
* RetryUntilElapsed:重試一定時(shí)間
*/
private static final RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3);
public static void main(String[] args) throws Exception {
//創(chuàng)建 CuratorFrameworkImpl實(shí)例
CuratorFramework client = CuratorFrameworkFactory.newClient(SERVER, SESSION_TIMEOUT, CONNECTION_TIMEOUT, retryPolicy);
//啟動(dòng)
client.start();
System.out.println("連接成功!");
Object o = client.getChildren().forPath("/");
System.out.println(o);
}
}
打印:

Java集成zookeeper筆記
一、引入zookeeper-3.4.5.jar(原生zk包)
slf4j.jar即可,其他還有zkClient和Curator,其中Curator封裝的zk客戶端組件最好用。
二、手寫ZookeeperBase.java
少?gòu)U話,上代碼:
簡(jiǎn)單的創(chuàng)建連接和增刪改查操作:
public class ZookeeperBase{
//zk集群地址(端口號(hào)為客戶端端口號(hào))
private static final String CONNECT_ADDR = "192.168.241.127:2181,192.168.241.128:2181,192.168.241.129:2181";
//session 超時(shí)時(shí)間,單位毫秒
private static final int SESSION_OUTTIME = 5000;
//用于阻塞程序執(zhí)行,直到zk成功連接后再發(fā)送繼續(xù)執(zhí)行信號(hào),因?yàn)閦k建立連接是異步的,阻塞是防止程序在zk成功連接前被調(diào)用。
private static final CountDownLatch contectedSemaphore = new CountDownLatch (1);
public static void main(String[] args)throws Exception{
Zookeeper zk = new Zookeeper(CONNECT_ADDR,SESSION_OUTTIME,new Watcher()){
@override
public void process(WatcherEvent event){ //WatcherEvent為觀察者監(jiān)聽事件
//獲取事件狀態(tài)(與客戶端連接狀態(tài)相關(guān))
/*
* KeeperState:Disconneced 連接失敗
* KeeperState:SyncConnected 連接成功
* KeeperState:AuthFailed 認(rèn)證失敗
* KeeperState:Expired 會(huì)話過期
*/
KeeperState keeperState = event.getState();
//獲取事件類型(與zknode相關(guān))
/*
* EventType:NodeCreated 節(jié)點(diǎn)創(chuàng)建
* EventType:NodeDataChanged 節(jié)點(diǎn)的數(shù)據(jù)變更
* EventType:NodeChildrentChanged 子節(jié)點(diǎn)下的數(shù)據(jù)變更
* EventType:NodeDeleted 節(jié)點(diǎn)刪除
* EventType:None 剛連接什么都沒做
*/
EventType eventType = event.getType();
//成功建立連接(固定寫法)
if(KeeperState.SyncConnected == keeperState){
if(EventType.None == eventType){
//發(fā)送信號(hào)讓程序繼續(xù)執(zhí)行
contectedSemaphore.countDown();
}
}
}
//阻塞程序執(zhí)行
contectedSemaphore.await();
//創(chuàng)建節(jié)點(diǎn)
//同步創(chuàng)建
String newNode = zk.create("/testRoot","data".getBytes(),ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT);
/*
*參數(shù)1:節(jié)點(diǎn)路徑:/testRoot,原生api不允許遞歸創(chuàng)建節(jié)點(diǎn),即沒有父節(jié)點(diǎn)不允許直接連帶父子節(jié)點(diǎn)一起創(chuàng)建。創(chuàng)建節(jié)點(diǎn)是要寫全路徑,例如:/testRoot/children。
*參數(shù)2:節(jié)點(diǎn)內(nèi)容:內(nèi)容類型為字節(jié)數(shù)組,不支持存儲(chǔ)序列化對(duì)象,例如不支持將java對(duì)象序列化為json存儲(chǔ),但可以使用java序列化框架,如hession或kyso。
*參數(shù)3:權(quán)限控制:在對(duì)權(quán)限要求不嚴(yán)格情況下都使用OPEN_ACL_UNSAFE開放權(quán)限即可。
*參數(shù)4:節(jié)點(diǎn)類型:提供了四種類型。
*PERSISTENT 持久化節(jié)點(diǎn)
*PERSISTENT SEQUENTIAL 持久順序節(jié)點(diǎn)
*EPHEMERAL 臨時(shí)節(jié)點(diǎn)
*EPHEMERAL SEQUENTIAL 臨時(shí)順序節(jié)點(diǎn)
*/
};
}
}
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
java學(xué)生信息管理系統(tǒng)MVC架構(gòu)詳解
這篇文章主要為大家詳細(xì)介紹了java學(xué)生信息管理系統(tǒng)MVC架構(gòu)的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-11-11
Java的無參構(gòu)造函數(shù)用法實(shí)例分析
這篇文章主要介紹了Java的無參構(gòu)造函數(shù)用法,結(jié)合實(shí)例形式分析了java無參構(gòu)造函數(shù)基本原理、用法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2019-09-09
java數(shù)據(jù)結(jié)構(gòu)之搜索二叉樹
這篇文章主要為大家詳細(xì)介紹了java數(shù)據(jù)結(jié)構(gòu)之搜索二叉樹,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01
JavaWeb文件上傳下載實(shí)例講解(酷炫的文件上傳技術(shù))
在Web應(yīng)用系統(tǒng)開發(fā)中,文件上傳功能是非常常用的功能,今天來主要講講JavaWeb中的文件上傳功能的相關(guān)技術(shù)實(shí)現(xiàn),本文給大家介紹的非常詳細(xì),具有參考借鑒價(jià)值,感興趣的朋友一起看看吧2016-11-11
idea設(shè)置JVM運(yùn)行參數(shù)的幾種方式
對(duì)JVM運(yùn)行參數(shù)進(jìn)行修改是JVM性能調(diào)優(yōu)的重要手段,本文主要介紹了idea設(shè)置JVM運(yùn)行參數(shù)的幾種方式,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04
Java全面細(xì)致講解Cookie與Session及kaptcha驗(yàn)證碼的使用
web開發(fā)階段我們主要是瀏覽器和服務(wù)器之間來進(jìn)行交互。瀏覽器和服務(wù)器之間的交互就像人和人之間進(jìn)行交流一樣,但是對(duì)于機(jī)器來說,在一次請(qǐng)求之間只是會(huì)攜帶著本次請(qǐng)求的數(shù)據(jù)的,但是可能多次請(qǐng)求之間是會(huì)有聯(lián)系的,所以提供了會(huì)話機(jī)制2022-06-06
idea根據(jù)實(shí)體類生成數(shù)據(jù)庫(kù)表的流程步驟
在開發(fā)的時(shí)候,經(jīng)常會(huì)遇到數(shù)據(jù)庫(kù)表結(jié)構(gòu)設(shè)計(jì)無法滿足業(yè)務(wù)的需求,需要去改動(dòng)數(shù)據(jù)庫(kù)表,我們就需要去設(shè)計(jì)數(shù)據(jù)庫(kù)的字段,然后又回來增加實(shí)體類里的字段,這樣很麻煩,所以本文給大家介紹了idea根據(jù)實(shí)體類生成數(shù)據(jù)庫(kù)表的流程步驟,需要的朋友可以參考下2024-12-12

