zookeeper使用Java客户端建立连接会话

一、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();
			}
		}
	}

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章