1. 程式人生 > >zookeeper學習筆記--建立會話

zookeeper學習筆記--建立會話

一:建立會話

客戶端可以通過建立一個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();
        }
    }
}