Zookeeper对外提供了一套Java的clientAPI。
本篇博客主要讲一下创建会话。
创建项目
首选,创建一个基于maven管理的简单javaproject。在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表示要连接的zookeeperserver地址列表。格式为: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();
}
}
}
因为Zookeeperclient和server创建会话是异步过程。因此使用CountDownLatch来堵塞线程,等待server创建完毕,并发送事件通知。
打印结果为:
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不对时,server会返回Expired事件。