Zookeeper客戶端API之建立會話(六)
阿新 • • 發佈:2019-01-27
Zookeeper對外提供了一套Java的客戶端API。本篇部落格主要講一下建立會話。
建立專案
首選,建立一個基於maven管理的簡單java工程。在pom檔案中引入zookeeper。
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.9</version>
</dependency>
編寫測試類
首選以最簡單的API為例。
public ZooKeeper(String connectString, int sessionTimeout, Watcher watcher)
其中,connectString表示要連線的zookeeper伺服器地址列表,格式為:192.168.0.1:2181。支援多個地址拼接,中間用逗號分隔。其中地址後面還可以拼接上zookeeper的操作路徑,比如:192.168.0.1:2181/zk/test。
sessionTimeout:會話超時時間,單位“毫秒”。通過心跳來監測會話的有效性。
watcher:監聽節點的狀態變化,如果發生變化則通知此watcher,做出相應處理。如果不需要監聽,則可設定為null。
測試程式碼:
package com.secbro.learn;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;
import java.io.IOException;
import java.util.Date;
import java.util.concurrent.CountDownLatch;
/**
* Created by zhuzs on 2017/3/9.
*/
public class TestSession implements Watcher{
private static CountDownLatch countDownLatch = new CountDownLatch(1);
public static void main(String[] args) throws IOException {
Long startTime = new Date().getTime();
ZooKeeper zooKeeper = new ZooKeeper("192.168.0.1:2181",5000,new TestSession());
try {
countDownLatch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("建立連線花費時間:" + (new Date().getTime() - startTime) + "ms");
System.out.println("連線狀態:" + zooKeeper.getState());
}
public void process(WatchedEvent event) {
System.out.println("Receive watcher event:" + event);
if(Event.KeeperState.SyncConnected == event.getState()){
countDownLatch.countDown();
}
}
}
由於Zookeeper客戶端和伺服器建立會話是非同步過程,因此使用CountDownLatch來阻塞執行緒,等待伺服器建立完成,併發送事件通知。
列印結果為:
Receive watcher event:WatchedEvent state:SyncConnected type:None path:null
建立連線花費時間:9155ms
連線狀態:CONNECTED
其他介面
public ZooKeeper(String connectString, int sessionTimeout, Watcher watcher,
boolean canBeReadOnly)
此方法多了一個canBeReadOnly引數,此引數表示當前會話是否支援“只讀”模式。
public ZooKeeper(String connectString, int sessionTimeout, Watcher watcher,
long sessionId, byte[] sessionPasswd)
此方法允許傳入sessionId和sessionPasswd,目的是為了重複使用會話。通過以下方法獲得:
zooKeeper.getSessionId();
zooKeeper.getSessionPasswd()
然後作為引數建立新的連線。當sessionId和sessionPasswd不正確時,伺服器會返回Expired事件。