Zookeeper 对外提供了一套 Java 的客户端 API。本篇博客主要讲一下创建会话。
首选,创建一个基于 maven 管理的简单 java 工程。在 pom 文件中引入 zookeeper。
- <dependency>
- <groupId>
- org.apache.zookeeper
- </groupId>
- <artifactId>
- zookeeper
- </artifactId>
- <version>
- 3.4.9
- </version>
- </dependency>
首选以最简单的 API 为例。
- public ZooKeeper(String connectString, int sessionTimeout, Watcher watcher)
其中,connectString 表示要连接的 zookeeper 服务器地址列表,格式为:192.168.0.1:2181。支持多个地址拼接,中间用逗号分隔。其中地址后面还可以拼接上 zookeeper 的操作路径,比如:192.168.0.1:2181/zk/test。
sessionTimeout:会话超时时间,单位 "毫秒"。通过心跳来监测会话的有效性。
watcher:监听节点的状态变化,如果发生变化则通知此 watcher,做出相应处理。如果不需要监听,则可设置为 null。
测试代码:
- package com.secbro.learn;
- import org.apache.zookeeper.WatchedEvent;
- import org.apache.zookeeper.Watcher;
- import org.apache.zookeeper.ZooKeeper;
- import java.io.IOException;
- import java.util.Date;
- import java.util.concurrent.CountDownLatch;
- /**
- * Created by zhuzs on 2017/3/9.
- */
- public class TestSession implements Watcher{
- private static CountDownLatch countDownLatch = new CountDownLatch(1);
- public static void main(String[] args) throws IOException {
- Long startTime = new Date().getTime();
- ZooKeeper zooKeeper = new ZooKeeper("192.168.0.1:2181",5000,new TestSession());
- try {
- countDownLatch.await();
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- System.out.println("创建连接花费时间:" + (new Date().getTime() - startTime) + "ms");
- System.out.println("连接状态:" + zooKeeper.getState());
- }
- public void process(WatchedEvent event) {
- System.out.println("Receive watcher event:" + event);
- if(Event.KeeperState.SyncConnected == event.getState()){
- countDownLatch.countDown();
- }
- }
- }
由于 Zookeeper 客户端和服务器创建会话是异步过程,因此使用 CountDownLatch 来阻塞线程,等待服务器创建完成,并发送事件通知。
打印结果为:
- Receive watcher event:WatchedEvent state:SyncConnected type:None path:null
- 创建连接花费时间:9155ms
- 连接状态:CONNECTED
- public ZooKeeper(String connectString, int sessionTimeout, Watcher watcher,
- boolean canBeReadOnly)
此方法多了一个 canBeReadOnly 参数,此参数表示当前会话是否支持 "只读" 模式。
- public ZooKeeper(String connectString, int sessionTimeout, Watcher watcher,
- long sessionId, byte[] sessionPasswd)
此方法允许传入 sessionId 和 sessionPasswd,目的是为了重复使用会话。通过以下方法获得:
- zooKeeper.getSessionId();
- zooKeeper.getSessionPasswd()
然后作为参数创建新的连接。当 sessionId 和 sessionPasswd 不正确时,服务器会返回 Expired 事件。
来源: http://blog.csdn.net/wo541075754/article/details/61190967