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

猜你喜欢

转载自blog.csdn.net/qq_35723073/article/details/81263914