zookeeper api 增删改查

package com.jianfei.zk;

import java.io.File;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.List;

import org.apache.commons.io.FileUtils;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.Watcher.Event.EventType;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.data.Stat;
import org.junit.Before;
import org.junit.Test;

public class ZKDemo {

 private ZooKeeper zk = null;

 @Before
 public void init() throws IOException {
  zk = new ZooKeeper("hdp-node01:2081", 2000, new Watcher() {
   public void process(WatchedEvent event) {
    if(event.getType() == EventType.None) return;
    System.out.println(event.getType()); 
    System.out.println(event.getPath()); 
    
    //-----解决持续监听
    try {
     //数据变化持续监听
     zk.getData("/sh18qi", true, null);
     //子节点持续监听
     zk.getChildren("/sh18qi", true);
    } catch (KeeperException e) {
     e.printStackTrace();
    } catch (InterruptedException e) {
     e.printStackTrace();
    }
   }
  });
 }
 
 /**
  * 向zookeeper服务集群中注册数据,添加znode
  * 
  * @throws InterruptedException
  * @throws KeeperException
  * @throws UnsupportedEncodingException
  */
 @Test
 public void testCreateZnode() throws UnsupportedEncodingException, KeeperException, InterruptedException {
  zk.create("/sh18qi", "这是我的第一个案例".getBytes("UTF-8"), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
  zk.create("/sh18qi/banzhang", "花花".getBytes("UTF-8"), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT_SEQUENTIAL);
  zk.create("/sh18qi/banmi", "草草".getBytes("UTF-8"), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT_SEQUENTIAL);
  zk.close();
 }
 /**
  * 从zookeeper删除znode
  * @throws InterruptedException
  * @throws KeeperException
  */
 @Test
 public void testDeleteZnode() throws InterruptedException, KeeperException{
  //参数1:要删除的节点路径
  //参数2:要删除的节点版本  -1 匹配所有版本
  zk.delete("/sh18qi", -1);
  //????不监听  为什么上面方法还是执行呢?
  Stat exites = zk.exists("/sh18qi", false);//第二个参数,是否监听  
  
  System.out.println(exites);
 }
 /**
  * 修改zookeeper节点
  * @throws UnsupportedEncodingException
  * @throws KeeperException
  * @throws InterruptedException
  */
 @Test
 public void testUpdateZnode() throws UnsupportedEncodingException, KeeperException, InterruptedException{
  byte[] data = zk.getData("/sh18qi", false, null);//默认最新
  System.out.println(new String(data,"UTF-8"));
  zk.setData("/sh18qi", "我有一只小毛驴".getBytes("UTF-8"), -1);
  data = zk.getData("/sh18qi", false, null);//默认最新
  System.out.println(new String(data,"UTF-8"));
 }
 /**
  * 查询zookeeper的子节点
  * @throws KeeperException
  * @throws InterruptedException
  */
 @Test
 public void testGetChildren() throws KeeperException, InterruptedException{
  List<String> children = zk.getChildren("/sh18qi", false);
  for(String child : children){
   System.out.println(child);
  }
 }
 /**
  * zk的监听机制:
  * 1.事先定义好监听的回调函数
  * 2.在对znode进行各种访问操作时可以注册监听
  * 3.监听的znode上发生相应的事件时,客户端zk会接收到zookeeper集群的事件通知
  * 4.客户端zk根据事件调用我们事先定义好的回掉函数
  * @throws InterruptedException 
  * @throws KeeperException 
  */
 @Test
 public void testWatch() throws KeeperException, InterruptedException{
  //在获取znode数据时注册监听
  //监听器只能起到一次作用,只要监听到一次事件就失效了
  //getData监听的是数据的更改
  byte[] data = zk.getData("/sh18qi", true, null);
  
  
  //在做查询子节点操作的时候注册监听
  //监听的事件就是监听节点下的子节点变化的事件
  List<String> children = zk.getChildren("/sh18qi", true);
  
  Thread.sleep(Long.MAX_VALUE);
  
  
  //事件类型
  //EventType
  
  
 }
 
 /**
  * 模拟配置文件集中管理
  * 将配置文件上传到zookeeper中
  * @throws IOException
  * @throws KeeperException
  * @throws InterruptedException
  */
 public void testUploadConfigFileToZookeeper() throws IOException, KeeperException, InterruptedException{
  String schema_xml = FileUtils.readFileToString(new File("g:/schema.xml"));
  //System.out.println(schema_xml);
//  zk.create("/conf", null, Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
  zk.create("/conf/schema.xml", schema_xml.getBytes("UTF-8"),Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
  
  zk.close();
 }
 
}

猜你喜欢

转载自chenjianfei2016.iteye.com/blog/2356677