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(); } }
zookeeper api 增删改查
猜你喜欢
转载自chenjianfei2016.iteye.com/blog/2356677
今日推荐
周排行