第一个ZooKeeper客户端程序

我们可以采用新建一个工程,然后导入ZooKeeper.3.4.7.jar包,接着编写独立的JAVA程序的方式来实现演示工作,如果采用这种方式,需要javac –cp命令编译java文件,并使用java –cp命令运行编译后的文件。这里不采用这种方式,而是采用ZooKeeper自带的源代码程序,新创建一个test文件夹,如图所示。


图1-3 ZooKeeper程序目录图

新建了test文件夹,位于“org.apache.zookeeper”这个package[1]下面。接下来编写第一个ZooKeeper程序,如清单所示。

清单 第一个ZooKeeper程序

package org.apache.zookeeper.test;

import java.io.IOException;

import java.util.ArrayList;

import java.util.List;

 

import org.apache.zookeeper.KeeperException;

import org.apache.zookeeper.ZooKeeper;

 

 

public class MyFirstZooKeeperClass {

     public static voidmain(String[] args) throws IOException{

     String hostPort ="172.10.201.53:2182";

     String zpath ="/";

     List <String> zooChildren = newArrayList<String>();

     ZooKeeper zk = newZooKeeper(hostPort,2000,null);

     if(zk != null){

         try{

             zooChildren = zk.getChildren(zpath,false);

             System.out.println("Znodes of'/':");

             for(String child:zooChildren){

                 System.out.println(child);

             }

         }catch(KeeperException ex){

             ex.printStackTrace();

         } catch (InterruptedException e) {

                // TODOAuto-generated catch block

                e.printStackTrace();

            }

     }

     }

}

 

 图 程序流程图

清单所示程序流程如上面这张图所示。首先我们导入了org.apache.zookeeper包下所有的类,因为这个包内部包含了所有客户端与ZooKeeper连接的类和接口,所以导入后能够满足我们的需求。

所有我们编写的代码都在main函数里面,首先我们定义了String变量hostPort,该变量在调用ZooKeeper构造函数的时候会被用到,ZooKeeper构造函数用于构建客户端和服务端的连接(Live Session),并且返回一个句柄(handle)用于后续在Session有效期内自由访问ZooKeeper服务。

ZooKeeper构造函数ZooKeeper(String connectString,intsessionTimeout,Watcher watcher)包含几个参数:

Ø  connectString:代表服务端地址,如代码中所示的172.10.201.53:2182,172.10.201.53是IP地址,2182是端口号;

Ø  sessionTimeout:代表会话超期时间,单位是毫秒,这里设置为2000毫秒,即2秒钟。这个值被ZooKeeper服务端用来计算客户端和它之间的心跳时间,如果超过2秒钟没有收到心跳,ZooKeeper服务端就认为客户端离线。

Ø  Watcher:一个Watcher对象,可以为空,我们程序里定义为Null。如果我们设置了Watcher对象,我们必须自己定义一个实现了Watcher接口的泪,这个类用来处理收到的ZooKeeper节点变化情况,所以顾名思义,Watcher就是监视着ZooKeeper服务端的变化。

除了上面这些参数以外,我们还有其他的参数,这里不多做介绍。

接下来调用返回的句柄的getChildren方法,该方法ZPath参数和Watch参数来访问ZooKeeper服务端并返回ZNode信息,程序中ZPath设置为根目录,Watch设置为Null。最后通过for语句循环打印ZNode信息并设置异常抛出机制。

清单 第一个ZooKeeper程序运行输出

[root@node3 bin]# java -cp $CLASSPATHorg.apache.zookeeper.test.MyFirstZooKeeperClass

2016-01-19 16:41:32,161 [myid:] - INFO [main:Environment@100] - Client environment:zookeeper.version=3.4.7--1,built on 01/07/2016 05:40 GMT

2016-01-19 16:41:32,165 [myid:] - INFO [main:Environment@100] - Client environment:host.name=node3

2016-01-19 16:41:32,165 [myid:] - INFO [main:Environment@100] - Client environment:java.version=1.7.0_79

2016-01-19 16:41:32,166 [myid:] - INFO [main:Environment@100] - Client environment:java.vendor=OracleCorporation

2016-01-19 16:41:32,168 [myid:] - INFO [main:Environment@100] - Client environment:java.home=/usr/lib/jdk1.7.0_79/jre

2016-01-19 16:41:32,168 [myid:] - INFO [main:Environment@100] - Clientenvironment:java.class.path=/home/zhoumingyao/zookeeper-3.4.7/bin/../build/classes:/home/zhoumingyao/zookeeper-3.4.7/bin/../build/lib/*.jar:/home/zhoumingyao/zookeeper-3.4.7/bin/../lib/slf4j-log4j12-1.6.1.jar:/home/zhoumingyao/zookeeper-3.4.7/bin/../lib/slf4j-api-1.6.1.jar:/home/zhoumingyao/zookeeper-3.4.7/bin/../lib/netty-3.7.0.Final.jar:/home/zhoumingyao/zookeeper-3.4.7/bin/../lib/log4j-1.2.16.jar:/home/zhoumingyao/zookeeper-3.4.7/bin/../lib/jline-0.9.94.jar:/home/zhoumingyao/zookeeper-3.4.7/bin/../zookeeper-3.4.7.jar:/home/zhoumingyao/zookeeper-3.4.7/bin/../src/java/lib/*.jar:/home/zhoumingyao/zookeeper-3.4.7/bin/../conf:.:/usr/lib/jdk1.7.0_79/lib:/usr/lib/jdk1.7.0_79/jre/lib:

2016-01-19 16:41:32,168 [myid:] - INFO [main:Environment@100] - Clientenvironment:java.library.path=/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib

2016-01-19 16:41:32,169 [myid:] - INFO [main:Environment@100] - Client environment:java.io.tmpdir=/tmp

2016-01-19 16:41:32,169 [myid:] - INFO [main:Environment@100] - Client environment:java.compiler=<NA>

2016-01-19 16:41:32,169 [myid:] - INFO [main:Environment@100] - Client environment:os.name=Linux

2016-01-19 16:41:32,169 [myid:] - INFO [main:Environment@100] - Client environment:os.arch=amd64

2016-01-19 16:41:32,169 [myid:] - INFO [main:Environment@100] - Clientenvironment:os.version=2.6.32-220.el6.x86_64

2016-01-19 16:41:32,169 [myid:] - INFO [main:Environment@100] - Client environment:user.name=root

2016-01-19 16:41:32,169 [myid:] - INFO [main:Environment@100] - Client environment:user.home=/root

2016-01-19 16:41:32,170 [myid:] - INFO [main:Environment@100] - Client environment:user.dir=/usr/lib/zookeeper-3.4.6/bin

2016-01-19 16:41:32,171 [myid:] - INFO [main:ZooKeeper@438] - Initiating client connection,connectString=172.10.201.53:2182 sessionTimeout=2000 watcher=null

2016-01-19 16:41:32,209 [myid:] - INFO [main-SendThread(172.10.201.53:2182):ClientCnxn$SendThread@1032] -Opening socket connection to server 172.10.201.53/172.10.201.53:2182. Will notattempt to authenticate using SASL (unknown error)

2016-01-19 16:41:32,214 [myid:] - INFO [main-SendThread(172.10.201.53:2182):ClientCnxn$SendThread@876] - Socketconnection established to 172.10.201.53/172.10.201.53:2182, initiating session

2016-01-19 16:41:32,255 [myid:] - INFO [main-SendThread(172.10.201.53:2182):ClientCnxn$SendThread@1299] -Session establishment complete on server 172.10.201.53/172.10.201.53:2182,sessionid = 0x352590b5be60000, negotiated timeout = 4000

2016-01-19 16:41:32,260 [myid:] - ERROR[main-EventThread:ClientCnxn$EventThread@532] - Error while calling watcher

java.lang.NullPointerException

        atorg.apache.zookeeper.ClientCnxn$EventThread.processEvent(ClientCnxn.java:530)

        atorg.apache.zookeeper.ClientCnxn$EventThread.run(ClientCnxn.java:505)

Znodes of'/':

[zookeeperroot]

hadoop-ha

zookeeper

HMS

从上面的程序运行结果可以看到,输出的最后几行代表了我们的打印记录,ZooKeeper根目录节点下包含了hadoop-ha、zookeeper和HMS三个节点。



[1] Java中的一个包就是一个类库单元,包内包含有一组类,它们在单一的名称空间之下被组织在了一起。这个名称空间就是包名。





欢迎关注麦克叔叔每晚10点说,感兴趣的朋友可以关注公众号,让我们一起学习与交流。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值