zookeeper使用Java客戶端建立連接會話

一、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();
			}
		}
	}

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章