一、zookeeper的Java客戶端
zookeeper-3.3.4.jar爲zookeeper官方提高的JavaAPI,zkClient-0.1.jar是再原生API基礎上進行的擴展。
創建會話的方法:客戶端可以創建一個zookeeper實例來連接zookeeper服務器。
Zookeeper(Arguments)根據參數不同,一共有4種構造方法,參數分別爲:
1、connectString:連接服務器列表
2、sessionTimeout:心跳檢測時間週期(以毫秒爲單位)
3、watch:事件處理通知器
4、canBeReadOnly:標識當前會話是否支持只讀
5、sessionID和sessionPasswd:提高連接zookeeper的sessionId和密碼,通過這兩個確定唯一一臺客戶端,目的是可以提供重複會話。
zookeeper客戶端與服務端會話的建立是一個異步的過程,也就是再程序中,程序的主線程在處理完客戶端初始化的方法後立即返回,此時並沒有真正建立一個會話,只有在會話生命週期處於CONNECTIING時纔算真正建立成功。
代碼
import java.util.concurrent.CountDownLatch;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.Watcher.Event.EventType;
import org.apache.zookeeper.Watcher.Event.KeeperState;
import org.apache.zookeeper.ZooKeeper;
public class ZookeeperBase {
//設置zookeeper連接地址
static final String CONNECT_ADDR = "";
//設置session的超時時間(以毫秒爲單位)
static final int SESSION_OUTTIME = 2000;
//信號量,阻塞程序執行,用於等待zookeeper連接成功,發送成功信號
/*countDownLatch這個類使一個線程等待其他線程各自執行完畢後再執行。
是通過一個計數器來實現的,計數器的初始值是線程的數量。每當一個線程執行完畢後,計數器的值就-1,
當計數器的值爲0時,表示所有線程都執行完畢,然後在閉鎖上等待的線程就可以恢復工作了。
參考:https://www.jianshu.com/p/e233bb37d2e6,https://www.cnblogs.com/Lee_xy_z/p/10470181.html
*/
//初始化程序計數器的值爲1
static final CountDownLatch connectedSemaphore = new CountDownLatch(1);
public static void main(String[] args) {
ZooKeeper zk = null;
try {
//創建zookeeper客戶端,Watch是接口,必須使用匿名內部類創建對象
//Watch指定事件處理程序類必須實現的公共接口,ZooKeeper客戶端將從與其連接的ZooKeepr服務器獲取各種事件
zk = new ZooKeeper(CONNECT_ADDR, SESSION_OUTTIME, new Watcher() {
@Override
//WatchedEvent表示Watcher能夠響應的ZooKeeper上的更改。WatchedEvent包括髮生的確切事件,
//ZooKeeper的當前狀態以及事件中涉及的znode的路徑
public void process(WatchedEvent event) {
//獲取事件的狀態
KeeperState keeperState = event.getState();
//獲取ZooKeeper上可能發生的事件類型
EventType eventType = event.getType();
//客戶端處於連接狀態,SyncConnected是KeeperState中的一個枚舉常量,返回的是
//keeperState的實例,KeeperState中還有AuthFailed(驗證失敗狀態)、Disconnected(斷開狀態)
//Expired(服務集羣已在此會話中過期)等枚舉常量
if(keeperState.SyncConnected==keeperState) {
//如果事件類是是無,表示剛建立好連接,None是EventType中的一個枚舉常量,
//EventType中還有NodeCreated(節點創建)、NodeDeleted(節點刪除)、NodeDataChanged(節點數據變更)
//等枚舉常量
if(eventType.None == eventType) {
System.out.println("已經建立連接");
//如果建立連接成功,將計數器的值減爲0,讓被阻塞的主線程繼續執行
connectedSemaphore.countDown();
}
}
}
});
//進行阻塞
//調用await()方法的線程會被掛起,它會等待直到程序計數器的值爲0才繼續執行
connectedSemaphore.await();
System.out.println("程序繼續執行");
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
zk.close();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}