客户端连接示例
Zookeeper类,是我们编程时最常用的类文件。这个类是Zookeeper客户端的主要类文件。如果要使用Zookeeper服务,应用程序首先必须创建一个Zookeeper实例,这时就需要使用此类。一旦客户端和Zookeeper服务建立起了连接,Zookeeper系统将会给次连接会话分配一个ID值,并且客户端将会周期性的向服务器端发送心跳来维持会话连接。只要连接有效,客户端就可以使用Zookeeper API来做相应处理了。
而客户端能进行的操作也就是服务中能进行的9中操作(参见Zookeeper–简介 之Zookeeper节点的属性 )
下面是一个简单的客户端连接,节点的创建等操作的示例:
public class ZooKeeperTest {
public static final int SESSION_TIMEOUT = 30000;
private ZooKeeper zk;
private Watcher wh = new Watcher(){
public void process(WatchedEvent event){
System.out.println(event.toString());
//如果连接诶成功,则输出其状态
if(event.getState() == KeeperState.SyncConnected){
System.out.println("客户端与zookeeper的连接会话创建成功"+event.getState());
}
}
};
//创建zookeeper客户端对象
public void createZKInstance() throws IOException{
zk = new ZooKeeper("192.168.57.130:2181,192.168.57.131:2181,192.168.57.132:2181",SESSION_TIMEOUT,wh);
System.out.println("状态:"+zk.getState());
}
//使用客户端来对zookeeper操作
public void zkOperations() throws KeeperException, InterruptedException{
//创建一个节点
System.out.println("创建javanode节点");
zk.create("/javanode2", "sss".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
String data = new String(zk.getData("/javanode2", false, null));
System.out.println(data);
}
public void list(String groupName) throws KeeperException, InterruptedException{
try{
List<String> children = zk.getChildren(groupName, false);
if(children.isEmpty()){
System.out.println("No members in group "+groupName);
System.exit(1);
}
System.out.println("--------------");
for(String child:children){
System.out.println(child);
}
System.out.println("--------------");
}catch(KeeperException.NoNodeException e){
System.out.println("Group :"+groupName +" does not exist");
System.exit(1);
}
}
public void zkClose() throws InterruptedException{
zk.close();
System.out.println("客户端关闭");
}
public static void main(String[] args) throws IOException, KeeperException, InterruptedException{
ZooKeeperTest zkt = new ZooKeeperTest();
zkt.createZKInstance();
zkt.zkOperations();
zkt.list("/");
zkt.zkClose();
}
}
运行结果为:
状态:CONNECTING
创建javanode节点
WatchedEvent state:SyncConnected type:None path:null
客户端与zookeeper的连接会话创建成功SyncConnected
--
sss
--------------
javanode2
zookeeper
pomelo
hbase
--------------
客户端关闭
Watch触发器示例
对Watch触发器进行补充(关于watch详细,参见文章 Zookeeper–简介 之Watch触发器)
下面是一个watch的简单示例:
public class SetDataSync implements Watcher{
private static CountDownLatch connectedSemaphore = new CountDownLatch(1);
private static ZooKeeper zk = null;
private static Stat stat = new Stat();
public void process(WatchedEvent event) {
if(event.getState() == KeeperState.SyncConnected ){
if(event.getType() == EventType.None && event.getPath() == null){
connectedSemaphore.countDown();
}else if(event.getType() == EventType.NodeDataChanged){
try {
System.out.println(new String(zk.getData(event.getPath(), true, stat)));
System.out.println(stat.getCzxid()+","+stat.getMzxid()+","+stat.getVersion());
} catch (KeeperException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public static void main(String[] args) throws IOException, KeeperException, InterruptedException{
String path = "/synctest";
//创建zookeeper的客户端
zk = new ZooKeeper("192.168.57.130:2181",30000,new SetDataSync());
connectedSemaphore.await();
System.out.println("----连接成功....");
zk.create(path, "test".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
System.out.println(new String(zk.getData(path, true, stat)));
System.out.println(stat.getCzxid()+","+stat.getMzxid()+","+stat.getVersion());
zk.setData(path, "up1".getBytes(), -1);
Thread.sleep(Integer.MAX_VALUE);
}
}