Zookeeper会话构建

Java客户端API使用
1、创建会话
客户端可以通过创建 一个Zookeeper实例来连接Zookeeper服务器
ZooKeeper(String connectString, int sessionTimeout, Watcher watcher)
ZooKeeper(String connectString, int sessionTimeout, Watcher watcher,boolean canBeReadOnly).
public ZooKeeper(String connectString, int sessionTimeout, Watcher watcher,long sessionId, byte[] sessionPasswd)
public ZooKeeper(String connectString, int sessionTimeout, Watcher watcher,long sessionId, byte[] sessionPasswd, boolean canBeReadOnly)
使用任意一个构造方法都可以顺利完成与Zookeeper服务器的会话创建
参数说明
connectString:指Zookeeper服务器列表,由英文状态逗号分开的host:port字符串组成,每一个都代表一台Zookeeper服务器,也可以带上根目录,例如”cdh1:2181,cdh2:2181/zk-host” 这样就指定了该客户端连接上的Zookeeper服务器之后,所有对Zookeeper的操作,都会基于这个根目录,例如客户端要对/topic/test操作,都会指向节点/zk-host/topic/test这个目录
sessionTimeout:指会话超时时间,是一个以”毫秒”为单位的整形值,在Zookeeper中有会话概念,在一个会话周期内,Zookeeper客户端和服务器之间会通过心跳检测机制来维持会话的有效性
watcher:Zookeeper允许客户端在构造方法中传入一个接口Watcher的实现类对象来作为默认的watcher事件通知处理器,当然,这个参数也可以设置null以表明不需要设置默认的watcher处理器,
canBeReadOnly:这是一个boolean类型的参数,用于标识当前会话是否支持”read-only”模式。默认情况下,在Zookeeper集群中,一个机器如果和集群中过半及以上机器失去了网络连接,那么这个机器不再处理客户端请求。
sessionId和sessionPasswd:分别代表会话ID和会话密钥,这2个参数能够唯一确定一个会话,同事客户端使用这两个参数可以实现客户端会话复用,从而达到恢复会话效果,具体使用是,第一次连接上Zookeeper服务器时,通过调用Zookeeper对象实例的以下2个接口,即可获取当前会话的ID和密钥
Long getSessionId()
byte[]getSessionPasswd()
获取到这2个参数值之后,就可以在下次创建Zookeeper对象实例的时候传入构造方法了

注意:Zookeeper客户端和服务端会话是建立是一个异步的过程,也就是说在程序中,构造方法会在处理完客户端初始化工作后立即返回,在大多数情况下,此时并没有真正建立好一个可用的会话,在会话生命周期中处于”CONNECTING”的状态,当该会话真正创建完毕后,Zookeeper服务端会向会话对应的客户端发送一个事件通知,告知客户端,客户端只有在获取这个通知之后,才算真正建立了会话。

package com.paic.Spark;

import org.apache.zookeeper.*;

import java.io.IOException;
import java.util.concurrent.CountDownLatch;

/**
 * Created by xlucas on 2018/4/11.
 */
public class ZookeeperDemo2 implements Watcher {
    private static CountDownLatch connectedSe=new CountDownLatch(1);
    public  static void main(String[] args) throws IOException, InterruptedException, KeeperException {
        //构建会话
        ZooKeeper zk=new ZooKeeper("10.25.76.173", 2000, new ZookeeperDemo2());
        connectedSe.await();
        String path1=zk.create("/zk-hosts","create1".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
        System.out.println("sucess create path "+ path1);

        String path2=zk.create("/zk-hosts1","create2".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE,CreateMode.EPHEMERAL_SEQUENTIAL);
        System.out.println("sucess create path"+path2);

    }
    //实现了process方法该方法负责处理来自Zookeeper服务端的watcher通知,在收到服务端发来的syncConnected事件之后
    //解除主程序在CountDownLatch上的等待阻塞,至此客户端会话创建完毕
    @Override
    public void process(WatchedEvent event) {
        System.out.println("Receive watched event"+ event);
        if(Watcher.Event.KeeperState.SyncConnected==event.getState()){
            connectedSe.countDown();
        }

    }
}

这里写代码片

运行日志

CONNECTING
Receive watched eventWatchedEvent state:SyncConnected type:None path:null
zookeeper session established
Receive watched eventWatchedEvent state:Expired type:None path:null
Receive watched eventWatchedEvent state:SyncConnected type:None path:null

猜你喜欢

转载自blog.csdn.net/paicmis/article/details/79903114
今日推荐