zookeeper學習筆記--建立會話
阿新 • • 發佈:2018-11-20
一:建立會話
客戶端可以通過建立一個Zookeeper例項來連線Zookeeper伺服器,Zookeeper的四種構造方法如下:
Zookeeper(String connectString, int sessionTimeout, Watcher watcher); Zookeeper(String connectString, int sessionTimeout, Watcher watcher, boolean canBeReadonly); Zookeeper(String connectString, int sessionTimeout, Watcher watcher, long sessionID, byte[] sessionPasswd) Zookeeper(String connectString, int sessionTimeout, Watcher watcher, long sessionID, byte[] sessionPasswd, boolean canBeReadonly);
構造方法引數說明:
- connectString 指定ZK伺服器列表,由英文逗號分隔開的IP:PORT組成,也可以設定客戶端連線上操作的根目錄,方法是:IP:PORT/路徑
- sessionTimeout 指會話超時時間,單位 毫秒
- Watcher:ZK允許客戶端傳入一個Watcher的實現類來作為預設的事件通知處理器,該引數可為null,表示不需要設定預設處理器。
- canBeReadonly:ZK叢集中,一臺機器如果和叢集中過半及以上機器失去了網路連線,那麼這個機器將不再接收客戶端請求,如果設定了readonly模式,將可以提供讀服務
- sessionID和sessionPasswd:代表會話ID和金鑰,確定唯一會話,可以實現客戶端恢復會話。使用方法:
第一次連線上ZK伺服器時,通過呼叫ZK物件例項以下兩個介面,即可獲得當前會話的ID和金鑰:
long getSessionID()
byte[] getSessionPasswd()
獲取到這兩個引數值後,就可以在下次建立ZK物件例項的時候傳入構造方法了。
備註:
ZK建立會話是一個非同步的過程,因此初始化構造方法並沒有建立一個真正的可用會話,只有當服務端向客戶端傳送了時間通知,該會話才可用。
程式碼示例
package com.sitech;
import java.util.concurrent.CountDownLatch;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.Watcher.Event.KeeperState;
import org.apache.zookeeper.ZooKeeper;
public class CreateZKSession implements Watcher{
private static CountDownLatch connectedSemaphore = new CountDownLatch(1);
public static void main(String[] args) throws Exception{
/*使用ZK構造方法例項化ZK物件來建立會話*/
/*new CreateZKSession 實現watcher介面,重寫process方法,處理服務端返回的非同步通知*/
ZooKeeper zookeeper = new ZooKeeper("127.0.0.1:2181",5000,new CreateZKSession());
System.out.println(zookeeper.getState());
// long sessionID = zookeeper.getSessionId(); //獲取會話ID
// byte[] sessionPasswd = zookeeper.getSessionPasswd(); //獲取會話金鑰
try {
connectedSemaphore.await();
} catch (InterruptedException e) {}
System.out.println("ZooKeeper session established.");
}
/*處理ZK服務端watcher通知,再接收到服務端發來的SyncConnected通知後,解除主程式的等待阻塞*/
public void process(WatchedEvent event) {
System.out.println("Receive watched event:" + event);
if (KeeperState.SyncConnected == event.getState()) {
connectedSemaphore.countDown();
}
}
}