转自:https://blog.csdn.net/en_joker/article/details/78686649

客户端可以通过创建一个ZooKeeper(org.apache.zookeeper.ZooKeeper)实例来连接ZooKeeper服务器。ZooKeeper的4种构造方法如下。

  • 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 指ZooKeeper服务器列表,由英文状态逗号分开的host:post字符串组成,每一个都代表一台ZooKeeper机器,例如,192.168.1.1:2181,192.168.1.2:2181,192.168.1.3:2181,这样就为客户端指定了三台服务器地址。另外,也可以在connectString中设置客户端连接上ZooKeeper后的根目录,方法是在host:host字符串之后添加上这个根目录,例如,192.168.1.1:2181,192.168.1.2:2181,192.168.1.3:2181/zk-book,这样就指定了该客户端连接上ZooKeeper服务器之后,所有对ZooKeeper的操作,都会基于这个根目录。例如,客户端对/foo/bar的操作,都会指向节点的操作,都会基于这个根目录,例如,客户端对/foo/bar的操作,都会指向节点/zk-book/foo/bar——这个目录也叫Chroot,即客户端隔离命名空间。
sessionTimeout 指会话的超时时间,是一个以“毫秒”为单位的整型值。在ZooKeeper中有会话的概念,在一个会话周期内,ZooKeeper客户端和服务器之间会通过心跳检测机制来维持会话的有效性,一旦在sessionTimeout时间内没有进行有效地心跳检测,会话就会失效。
watcher ZooKeeper允许客户端在构造方法中传入一个接口Watcher(org.apache.zookeeper.Watcher)的实现类对象来作为默认的Watcher事件通知处理器。当然,该参数可以设置为null以表明不需要设置默认的Watcher处理器。
canBeReadOnly 这是一个boolean类型的参数,用于标识当前会话是否支持“read-only(只读)”模式。默认情况下,在ZooKeeper集群中,一个机器如果和集群中过半及以上机器失去了网络连接,那么这个机器将不再处理客户端请求(包括读写请求)。但是在某些使用场景下,当ZooKeeper服务器发生此类故障的时候,我们还是希望ZooKeeper服务器能够提供读服务(当然写服务肯定无法提供)——这就是ZooKeeper的“read-only”模式。
sessionId和sessionPaswd 分别代表会话ID和会话秘钥。这两个参数能够唯一确定一个会话,同时客户端使用这两个参数可以实现客户端会话复用,从而达到恢复会话的效果。具体使用方法是,第一次连接上ZooKeeper服务器时,通过调用ZooKeeper对象实例的以下两个接口,即可获得当前会话的ID和密钥:
long getSessionId();
byte[] getSessionPasswd();
获取到这两个参数值之后,就可以在下次创建ZooKeeper对象实例的时候传入构造方法了。

注意,ZooKeeper客户端和服务端会话的建立是一个异步的过程,也就是说在程序中,构造方法会在处理完客户端初始化工作后立即返回,在大多数情况下,此时并没有真正建立好一个可用的会话,在会话的生命周期中处于“CONNECTING”的状态。

当该会话真正创建完毕后,ZooKeeper服务端会向会话对应的客户端发送一个事件通知,以告知客户端,客户端只有在获取这个通知之后,才算真正建立了会话。

该构造方法内部实现了与ZooKeeper服务器之间的TCP连接创建,负责维护客户端会话的生命周期。

创建一个最基本的ZooKeeper会话实例

public class ZooKeeper_Constructor_Usage_Simple implements Watcher {

private static CountDownLatch connectedSemaphore = new CountDownLatch(1);

public static void main(String[] args) throws Exception {

ZooKeeper zookeeper = new ZooKeeper("domain1.book.zookeeper:2181" , 5000 , new ZooKeeper_Constructor_Usage_Simple());

System.out.println(zookeeper.getState());

try {

connectedSemaphore.await();

} catch (InterruptedException e) {}

System.out.println("ZooKeeper session established.");

}

public void process(WatchedEvent event) {

System.out.println("Receive watched event: " + event);

if (KeeperState.SyncConnected == event.getState()) {

connectedSemaphore.countDown();

}

}

}

运行程序,输出结果如下:

在上面这个程序片段中,我们使用第一种构造方法ZooKeeper(String connectString , int sessionTimeout , Watcher watcher) 来实例化一个ZooKeeper对象,从而建立了会话。

另外,ZooKeeper_Constructor_Usage类实现了Watcher接口,重写了process方法,该方法负责处理来自ZooKeeper服务器的Watcher通知,在收到服务端发来的SyncConnected事件之后,解除主程序在CountDownLatch上的等待阻塞。至此,客户端会话创建完毕。

创建一个复用sessionId和sessionPasswd的ZooKeeper对象实例

在上面列出的ZooKeeper客户端构造方法中,我们看到ZooKeeper构造方法允许传入sessionId和sessionPasswd——客户端传入sessionId和sessionPasswd的目的是为了复用会话,以维持之前会话的有效性。下面是一个复用sessionId和sessionPasswd来创建ZooKeeper对象实例的示例。

public class ZooKeeper_Constructor_Usage_With_SID_PASSWD implements Watcher {

private static CountDownLatch connectedSemaphore = new CountDownLatch(1);

public static void main(String[] args) throws Exception {

ZooKeeper zookeeper = new ZooKeeper("domain1.book.zookeeper:2181", 5000, new ZooKeeper_Constructor_Usage_With_SID_PASSWD());

connectedSemaphore.await();

long sessionId = zookeeper.getSessionId();

byte[] passwd = zookeeper.getSessionPasswd();

// Use illegal sessionId and sessionPasswd

zookeeper = new ZooKeeper("domain1.book.zookeeper:2181", 5000 , new ZooKeeper_Constructor_Usage_With_SID_PASSWD(), 1l, "test".getBytes());

// Use correct sessionId and sessionPasswd

zookeeper = new ZooKeeper("domain1.book.zookeeper:2181", 5000 , new ZooKeeper_Constructor_Usage_With_SID_PASSWD(), sessionId, passwd);

Thread.sleep(Integer.MAX_VALUE);

}

public void process(WatchedEvent event) {

System.out.println("Receive watched event: " + event);

if (KeeperState.SyncConnected == event.getState()) {

connectedSemaphore.countDown();

}

}

}

运行程序,输出结果如下:

从上面这个示例程序和结果输出中,我们可以看出,第一次使用了错误的sessionId和sessionPasswd来创建ZooKeeper客户端的实例,结果客户端接收到了服务端的Expired事件通知;而第二次则使用正确的sessionId和sessionPasswd来创建客户端的实例,结果连接成功。

12. ZooKeeper之Java客户端API使用—创建会话。的更多相关文章

  1. Zookeeper的java客户端API使用方法(五)

    前面几篇博文,我们简单的介绍了一下zookeeper,如何安装zookeeper集群,以及如何使用命令行等.这篇博文我们重点来看下Zookeeper的java客户端API使用方式. 创建会话 客户端可 ...

  2. zookeeper的Java客户端API

    zookeeper作为一个分布式服务框架,主要用来解决分布式数据一致性问题,对多种语言提供了API.这里主要记录下JAVA客户端API的使用. 1.创建会话 客户端可以通过创建一个ZooKeeper实 ...

  3. [转载] ZooKeeper的Java客户端API

    转载自 http://www.cnblogs.com/ggjucheng/p/3370359.html http://zookeeper.apache.org/doc/trunk/javaExampl ...

  4. 六:ZooKeeper的java客户端api的使用

    一:客户端链接测试 package com.yeepay.sxf.createConnection; import java.io.IOException; import org.apache.zoo ...

  5. 13.Zookeeper的java客户端API使用方法

    转自:https://blog.csdn.net/jiuqiyuliang/article/details/56012027

  6. 读《分布式一致性原理》JAVA客户端API操作2

    创建节点 通过客户端API来创建一个数据节点,有一下两个接口: public String create(final String path, byte data[], List<ACL> ...

  7. ZooKeeper学习总结(2)——ZooKeeper开源Java客户端ZkClient使用

    zkclient是zookeeper的Java客户端.它让Zookeeper API 使用起来更简单:它非常方便订阅各种事件并自动重新绑定事件(会话建立.节点修改.节点删除.子节点变更等):它提供了s ...

  8. 02.ZooKeeper的Java客户端使用

    1.ZooKeeper常用客户端比较 1.ZooKeeper常用客户端     zookeeper的常用客户端有3种,分别是:zookeeper原生的.Apache Curator.开源的zkclie ...

  9. JAVA客户端API调用memcached两种方式

    1. memcached client for java客户端API:memcached client for java 引入jar包:java-memcached-2.6.2.jar package ...

随机推荐

  1. BZOJ 3262 cdq分治 OR 树套树

    注意判断 三个条件都一样的-- (CDQ分治 其实并不是很难理解 只是想不到--) CDQ分治: //By SiriusRen #include <cstdio> #include < ...

  2. vsphere平台windows虚拟机克隆的小插曲(无法登陆系统)

    问题: 1.克隆完windows虚拟化后输入法乱码. 2.开启远程的情况下远程登录输入正确的密码也无法登录. 解决: 1.更改管理员用户密码(不输入原win7密码更改win7密码). 2.重新启用管理 ...

  3. scrollWidth到底是什么???

    贴上MDN对scrollwidth的定义: The Element.scrollWidth read-only property is a measurement of the width of an ...

  4. LeetCode 223 Rectangle Area(矩形面积)

    翻译 找到在二维平面中两个相交矩形的总面积. 每一个矩形都定义了其左下角和右上角的坐标. (矩形例如以下图) 如果,总占地面积永远不会超过int的最大值. 原文 分析 这题前天试过,写了一堆推断.终究 ...

  5. SQL两表之间:依据一个表的字段更新还有一个表的字段

    1. 写法轻松.更新效率高: update table1 set field1=table2.field1, field2=table2.field2 from table2 where table1 ...

  6. 转:IOS的推送。是一个强大的功能

    IOS下我们很多人天天开着 邮件推送 微信推送 QQ推送 微博推送 新浪微博推送,安卓敢吗? 五个后台进程消耗电.流量谁敢这么做?现在安卓也出了推送,但绝对是伪推送.实际是挂了个进程,关掉了就收不到. ...

  7. UI_搭建MVC

    新建RootViewController 继承于 UIViewController 新建RootView 继承于 UIView AppDelegate.m 中引入 #import "Root ...

  8. SQL查询表中的用那些索引

    方法1. 使用系统表   -- 查询一个表中的索引及索引列 USE AdventureWorks2008 GO SELECT indexname = a.name , tablename = c. n ...

  9. Onvif开发之基础介绍篇

    什么是Onvif协议,谁开启了Onvif时代? ONVIF:原意为 开放型网络视频接口论坛,即 Open Network Video Interface Forum ,是安讯士.博世.索尼等三家公司在 ...

  10. vuejs实现表格分页

    http://www.cnblogs.com/landeanfen/p/6054654.html#_label3_8 <html xmlns="http://www.w3.org/19 ...