码迷,mamicode.com
首页 > 编程语言 > 详细

ZooKeeper JAVA API 之环境准备和创建会话

时间:2015-05-03 22:14:35      阅读:249      评论:0      收藏:0      [点我收藏+]

标签:

    Zookeeper是一个开放源代码的分布式协调服务,由雅虎创建,是Google Chubby的开源实现。Zookeeper的设计目标是将那些复杂且容易出错的分布式一致性服务封装起来,构成一个高效可靠的元语集,并以一系列简单易用的接口提供给用户使用。

单机模式部署与运行(Windows)

  1. 确保已经安装了JAVA 1.6及其以上版本的JDK
  2. 下载Zookeeper    http://zookeeper.apache.org/releases.html  目前稳定版本即stable版本为3.4.6。将下载完成的压缩包解压到%ZK_HOME%下,其中ZK_HOME 目录可以随意设定,如:D://programes 等
  3. 配置文件 zoo.cfg ,单机模式下,只需要将%ZK_HOME%/conf/zoo_sample.cfg文件重命名即可
  4. 启动服务,在%ZK_HOME%bin目录下执行zkServer.cmd即可启动zookeeper服务器

Zookeeper 可执行脚本说明

  1. zkCleanup  清理ZooKeeper历史数据,包括事务日志和快照文件
  2. zkCli  ZooKeeper的一个建议客户端
  3. zkEnv  设置ZooKeeper的环境变量
  4. zkServer  ZooKeeper服务器的启动、停止和重启脚本

创建会话

       客户端可以通过创建一个ZooKeeper实例来连接ZooKeeper服务器。该类中的注释这样写道:

ZooKeeper类是ZooKeeper客户端库的主类。要使用ZooKeeper服务,应用程序首先必须要实现一个ZooKeeper的实例。所有的迭代都将通过调用ZooKeeper类的方法来完成。这个类的方法都是线程安全的除非另有说明。
 一旦一个与服务器的连接被建立,会分配给客户端一个Session ID. 客户端会周期性地发送心跳到服务器端,以保持会话有效。
 只要Session ID 有效,应用程序都可以通过客户端调用ZooKeeper的 API
  如果因为某些原因,导致客户端未能在指定的时间段内(超过SessionTimeout的值)发送心跳到服务器端,则该会话将过期,Session ID 将失效。
  如果客户端对象不可用,为了调用ZooKeeper API,应用程序必须创建一个新的客户端

 

ZooKeeper的构造方法有:

 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,boolean canBeReadOnly)

  ZooKeeper(String connectString,int sessionTimeout,Watcher watcher,long sessionId,byte[] sessionPasswd, boolean canBeReadOnly)

   connectString 是指ZooKeeper服务器的列表,host:prot,host:port 这样的格式构成,即主机:端口号通过英文逗号分隔。当然如果是单击模式下只需要一个;

    sessionTimeout 值会话的超时时间,单位是毫秒

  watcher Watcher事件的处理器,如果设置为null,表示不需要默认的Watcher事件处理器

   canBeReadOnly 用于表示当前会话是否支持 read-only

    sessionId,sessionPasswd 分别代表 会话的Id和密钥。这两个参数可以唯一确定一个会话。可以通过ZooKeeper 实例调用 getSesssionId()和getSessionPasswd()方法获取。

 

Java代码   技术分享
  1. /** 
  2.  *创建一个最基本的ZooKeeper会话示例 
  3.  * @author zhangwei_david 
  4.  * @version $Id: ZKConstructorDemo.java, v 0.1 2015年5月1日 下午5:55:21 zhangwei_david Exp $ 
  5.  */  
  6. public class ZKConstructorDemo implements Watcher {  
  7.   
  8.     private static CountDownLatch connectedSemphore = new CountDownLatch(1);  
  9.   
  10.     public static void main(String[] args) throws Exception {  
  11.         //创建Zookeeper会话实例  
  12.         ZooKeeper zookeeper = new ZooKeeper("127.0.0.1:2181"5000new ZKConstructorDemo());  
  13.         // 输出当前会话的状态  
  14.         System.out.println("zk客户端的状态是:" + zookeeper.getState());  
  15.         System.out.println("zk 客户端的sessionId=" + zookeeper.getSessionId() + ",  sessionPasswd是:"  
  16.                            + new String(zookeeper.getSessionPasswd()));  
  17.         try {  
  18.             // 当前闭锁在为0之前一直等待,除非线程中断  
  19.             connectedSemphore.await();  
  20.         } catch (Exception e) {  
  21.             System.out.println("Zookeeper session established");  
  22.         }  
  23.     }  
  24.   
  25.     /** 
  26.      * @see org.apache.zookeeper.Watcher#process(org.apache.zookeeper.WatchedEvent) 
  27.      */  
  28.     public void process(WatchedEvent event) {  
  29.         System.out.println("Receive watched event:" + event);  
  30.         //如果客户端已经处于连接状态闭锁减去1  
  31.         if (KeeperState.SyncConnected == event.getState()) {  
  32.             connectedSemphore.countDown();  
  33.         }  
  34.     }  
  35. }  

 结果:

Java代码   技术分享
  1. 2015-05-01 19:03:43  [ main:0 ] - [ INFO ]  Client environment:zookeeper.version=3.4.6-1569965, built on 02/20/2014 09:09 GMT  
  2. 2015-05-01 19:03:43  [ main:0 ] - [ INFO ]  Client environment:host.name=David  
  3. 2015-05-01 19:03:43  [ main:0 ] - [ INFO ]  Client environment:java.version=1.8.0  
  4. 2015-05-01 19:03:43  [ main:0 ] - [ INFO ]  Client environment:java.io.tmpdir=C:\Users\Lenovo\AppData\Local\Temp\  
  5. 2015-05-01 19:03:43  [ main:0 ] - [ INFO ]  Client environment:java.compiler=<NA>  
  6. 2015-05-01 19:03:43  [ main:0 ] - [ INFO ]  Client environment:os.name=Windows 8.1  
  7. 2015-05-01 19:03:43  [ main:0 ] - [ INFO ]  Client environment:os.arch=x86  
  8. 2015-05-01 19:03:43  [ main:0 ] - [ INFO ]  Client environment:os.version=6.3  
  9. 2015-05-01 19:03:43  [ main:0 ] - [ INFO ]  Client environment:user.name=Lenovo  
  10. 2015-05-01 19:03:43  [ main:0 ] - [ INFO ]  Client environment:user.home=C:\Users\Lenovo  
  11. 2015-05-01 19:03:43  [ main:0 ] - [ INFO ]  Client environment:user.dir=H:\Alipay.com\workspace4alipay\demo  
  12. 2015-05-01 19:03:43  [ main:0 ] - [ INFO ]  Initiating client connection, connectString=127.0.0.1:2181 sessionTimeout=5000 watcher=com.cathy.demo.zk.ZKConstructorDemo@1e717c2  
  13. zk客户端的状态是:CONNECTING  
  14. zk 客户端的sessionId=0,  sessionPasswd是:  

 

Java代码   技术分享
  1. **  
  2.  *使用SessionId和Sessionpwd创建的ZooKeeper会话示例  
  3.  * @author  zhangwei_david  
  4.  * @version $Id: ZKConstructorWithIdAndPasswdDemo.java, v 0.1 201551日 下午5:55:21 zhangwei_david Exp $  
  5.  */  
  6. public class ZKConstructorWithIdAndPasswdDemo implements Watcher {  
  7.   
  8.     private static CountDownLatch connectedSemphore = new CountDownLatch(1);  
  9.   
  10.     public static void main(String[] args) throws Exception {  
  11.         //创建Zookeeper会话实例  
  12.         ZooKeeper zookeeper = new ZooKeeper("127.0.0.1:2181"5000,  
  13.             new ZKConstructorWithIdAndPasswdDemo());  
  14.         // 输出当前会话的状态  
  15.         System.out.println("未使用id和密钥创建zk客户端的状态是:" + zookeeper.getState());  
  16.         long sessionId = zookeeper.getSessionId();  
  17.         byte[] sessionPasswd = zookeeper.getSessionPasswd();  
  18.         System.out.println("zk 客户端的sessionId=" + zookeeper.getSessionId() + ",  sessionPasswd是:"  
  19.                 + new String(zookeeper.getSessionPasswd()));  
  20.         zookeeper = new ZooKeeper("127.0.0.1:2181"5000new ZKConstructorWithIdAndPasswdDemo(),  
  21.             sessionId, sessionPasswd);  
  22.         System.out.println("使用id和密钥创建zk客户端的状态是:" + zookeeper.getState());  
  23.   
  24.         zookeeper = new ZooKeeper("127.0.0.1:2181"5000new ZKConstructorWithIdAndPasswdDemo(),  
  25.             1L, "test".getBytes());  
  26.         System.out.println("使用错误id和密钥创建zk客户端的状态是:" + zookeeper.getState());  
  27.         try {  
  28.             // 当前闭锁在为0之前一直等待,除非线程中断  
  29.             connectedSemphore.await();  
  30.         } catch (Exception e) {  
  31.             System.out.println("Zookeeper session established");  
  32.         }  
  33.     }  
  34.   
  35.     /** 
  36.      * @see org.apache.zookeeper.Watcher#process(org.apache.zookeeper.WatchedEvent) 
  37.      */  
  38.     public void process(WatchedEvent event) {  
  39.         System.out.println("Receive watched event:" + event);  
  40.         //如果客户端已经处于连接状态闭锁减去1  
  41.         if (KeeperState.SyncConnected == event.getState()) {  
  42.             connectedSemphore.countDown();  
  43.         }  
  44.     }  
  45. }  

 

结果:

Java代码   技术分享
  1. 2015-05-01 19:14:34  [ main:0 ] - [ INFO ]  Initiating client connection, connectString=127.0.0.1:2181 sessionTimeout=5000 watcher=com.cathy.demo.zk.ZKConstructorWithIdAndPasswdDemo@1e717c2  
  2. 未使用id和密钥创建zk客户端的状态是:CONNECTING  
  3. zk 客户端的sessionId=0,  sessionPasswd是:  
  4. 2015-05-01 19:14:34  [ main:31 ] - [ INFO ]  Initiating client connection, connectString=127.0.0.1:2181 sessionTimeout=5000 watcher=com.cathy.demo.zk.ZKConstructorWithIdAndPasswdDemo@aa7bc2 sessionId=0 sessionPasswd=<hidden>  
  5. 使用id和密钥创建zk客户端的状态是:CONNECTING  
  6. 2015-05-01 19:14:34  [ main:31 ] - [ INFO ]  Initiating client connection, connectString=127.0.0.1:2181 sessionTimeout=5000 watcher=com.cathy.demo.zk.ZKConstructorWithIdAndPasswdDemo@ccd017 sessionId=1 sessionPasswd=<hidden>  
  7. 使用错误id和密钥创建zk客户端的状态是:CONNECTING  
  8. 2015-05-01 19:14:34  [ main-SendThread(127.0.0.1:2181):31 ] - [ INFO ]  Opening socket connection to server 127.0.0.1/127.0.0.1:2181. Will not attempt to authenticate using SASL (unknown error)  
  9. 2015-05-01 19:14:34  [ main-SendThread(127.0.0.1:2181):31 ] - [ INFO ]  Opening socket connection to server 127.0.0.1/127.0.0.1:2181. Will not attempt to authenticate using SASL (unknown error)  
  10. 2015-05-01 19:14:34  [ main-SendThread(127.0.0.1:2181):31 ] - [ INFO ]  Opening socket connection to server 127.0.0.1/127.0.0.1:2181. Will not attempt to authenticate using SASL (unknown error)  
  11. 2015-05-01 19:14:34  [ main-SendThread(127.0.0.1:2181):47 ] - [ INFO ]  Socket connection established to 127.0.0.1/127.0.0.1:2181, initiating session  
  12. 2015-05-01 19:14:34  [ main-SendThread(127.0.0.1:2181):47 ] - [ INFO ]  Socket connection established to 127.0.0.1/127.0.0.1:2181, initiating session  
  13. 2015-05-01 19:14:34  [ main-SendThread(127.0.0.1:2181):47 ] - [ INFO ]  Socket connection established to 127.0.0.1/127.0.0.1:2181, initiating session  
  14. 2015-05-01 19:14:34  [ main-SendThread(127.0.0.1:2181):47 ] - [ INFO ]  Session establishment complete on server 127.0.0.1/127.0.0.1:2181, sessionid = 0x14d0ee972c70006, negotiated timeout = 5000  
  15. 2015-05-01 19:14:34  [ main-SendThread(127.0.0.1:2181):47 ] - [ INFO ]  Unable to reconnect to ZooKeeper service, session 0x1 has expired, closing socket connection  
  16. Receive watched event:WatchedEvent state:SyncConnected type:None path:null  
  17. Receive watched event:WatchedEvent state:Expired type:None path:null  
  18. 2015-05-01 19:14:34  [ main-SendThread(127.0.0.1:2181):47 ] - [ INFO ]  Session establishment complete on server 127.0.0.1/127.0.0.1:2181, sessionid = 0x14d0ee972c70007, negotiated timeout = 5000  
  19. 2015-05-01 19:14:34  [ main-EventThread:47 ] - [ INFO ]  EventThread shut down  

ZooKeeper JAVA API 之环境准备和创建会话

标签:

原文地址:http://my.oschina.net/u/2273085/blog/410151

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!