一、zookeeper的Java客户端
zookeeper-3.3.4.jar为zookeeper官方提高的JavaAPI,zkClient-0.1.jar是再原生API基础上进行的扩展。
创建会话的方法:客户端可以创建一个zookeeper实例来连接zookeeper服务器。
Zookeeper(Arguments)根据参数不同,一共有4种构造方法,参数分别为:
1、connectString:连接服务器列表
2、sessionTimeout:心跳检测时间周期(以毫秒为单位)
3、watch:事件处理通知器
4、canBeReadOnly:标识当前会话是否支持只读
5、sessionID和sessionPasswd:提高连接zookeeper的sessionId和密码,通过这两个确定唯一一台客户端,目的是可以提供重复会话。
zookeeper客户端与服务端会话的建立是一个异步的过程,也就是再程序中,程序的主线程在处理完客户端初始化的方法后立即返回,此时并没有真正建立一个会话,只有在会话生命周期处于CONNECTIING时才算真正建立成功。
代码
import java.util.concurrent.CountDownLatch;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.Watcher.Event.EventType;
import org.apache.zookeeper.Watcher.Event.KeeperState;
import org.apache.zookeeper.ZooKeeper;
public class ZookeeperBase {
//设置zookeeper连接地址
static final String CONNECT_ADDR = "";
//设置session的超时时间(以毫秒为单位)
static final int SESSION_OUTTIME = 2000;
//信号量,阻塞程序执行,用于等待zookeeper连接成功,发送成功信号
/*countDownLatch这个类使一个线程等待其他线程各自执行完毕后再执行。
是通过一个计数器来实现的,计数器的初始值是线程的数量。每当一个线程执行完毕后,计数器的值就-1,
当计数器的值为0时,表示所有线程都执行完毕,然后在闭锁上等待的线程就可以恢复工作了。
参考:https://www.jianshu.com/p/e233bb37d2e6,https://www.cnblogs.com/Lee_xy_z/p/10470181.html
*/
//初始化程序计数器的值为1
static final CountDownLatch connectedSemaphore = new CountDownLatch(1);
public static void main(String[] args) {
ZooKeeper zk = null;
try {
//创建zookeeper客户端,Watch是接口,必须使用匿名内部类创建对象
//Watch指定事件处理程序类必须实现的公共接口,ZooKeeper客户端将从与其连接的ZooKeepr服务器获取各种事件
zk = new ZooKeeper(CONNECT_ADDR, SESSION_OUTTIME, new Watcher() {
@Override
//WatchedEvent表示Watcher能够响应的ZooKeeper上的更改。WatchedEvent包括发生的确切事件,
//ZooKeeper的当前状态以及事件中涉及的znode的路径
public void process(WatchedEvent event) {
//获取事件的状态
KeeperState keeperState = event.getState();
//获取ZooKeeper上可能发生的事件类型
EventType eventType = event.getType();
//客户端处于连接状态,SyncConnected是KeeperState中的一个枚举常量,返回的是
//keeperState的实例,KeeperState中还有AuthFailed(验证失败状态)、Disconnected(断开状态)
//Expired(服务集群已在此会话中过期)等枚举常量
if(keeperState.SyncConnected==keeperState) {
//如果事件类是是无,表示刚建立好连接,None是EventType中的一个枚举常量,
//EventType中还有NodeCreated(节点创建)、NodeDeleted(节点删除)、NodeDataChanged(节点数据变更)
//等枚举常量
if(eventType.None == eventType) {
System.out.println("已经建立连接");
//如果建立连接成功,将计数器的值减为0,让被阻塞的主线程继续执行
connectedSemaphore.countDown();
}
}
}
});
//进行阻塞
//调用await()方法的线程会被挂起,它会等待直到程序计数器的值为0才继续执行
connectedSemaphore.await();
System.out.println("程序继续执行");
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
zk.close();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}