本文介绍了,使用zookeeper api实现增删改查和wacth的观察
1,准备环境,eclipse,maven,和一个log4j.properties文件,zookeeper环境和一些基础介绍我就不用说了吧,之前在下面两篇文章都已经介绍了
zookeeper安装: https://blog.csdn.net/weixin_41122339/article/details/81840794
zookeeper介绍: https://blog.csdn.net/weixin_41122339/article/details/81841646
log4j文件在zookeeper目录下的conf目录下
如果没有使用maven的同志可以把zookeeper目录下的lib下的全部jar包考到eclipse下
2,创建项目
1,创建项目就不用说了吧
2,在pom文件下添加(不使用maven可以略过)
<dependencies> <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3.4.9</version> </dependency> dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.10</version> </dependency> </dependencies>
3,在项目的src下log4j文件添加上去,然后开始写项目
我直接沾代码上面的注释清晰的
package myzookeeper_demo; import java.util.List; import org.apache.log4j.Logger; 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; import org.apache.zookeeper.ZooKeeper; import org.apache.zookeeper.data.Stat; import org.junit.Test; public class zktest { /** * 创建节点 * * @throws Exception */ @Test public void createnode() throws Exception { // 创建zookeeper对象使用客户端链接zookeeper集群服务 // zookeeper(1,集群ip和端口2,指定连接的超时时间3,watch事件回调接口我这里没有启用,后面会讲) ZooKeeper zk = new ZooKeeper("t125:2181,t126:2181,t127:2181", 5000, null); // 使用zk对象调用create方法创建节点 1234是对应的参数位置 // create(1,zookeeper路径2,创建节点的名字3,acl.指定权限信息, 如果不想指定权限, // 可以传入Ids.OPEN_ACL_UNSAFE.4,创建的类型这里有四种具体上一篇有讲述zookeeper的节点类型) String create = zk.create("/zxz/a", "abc".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); // 打印 System.out.println(create); } /** * 删除节点 * * @throws Exception */ @Test public void deletenode() throws Exception { // 创建zookeeper对象使用客户端链接zookeeper集群服务 ZooKeeper zk = new ZooKeeper("t125:2181,t126:2181,t127:2181", 5000, null); // 使用zk对象调用delete方法删除节点 // delete(1,路径名2,这个代表我们要删除的版本号,我这里指定的-1是无视版本) zk.delete("/zxz/a", -1); } /** * 列出根目录下的所有孩子节点 * * @throws Exception */ @Test public void listallnode() throws Exception { // 创建zookeeper对象使用客户端链接zookeeper集群服务 ZooKeeper zk = new ZooKeeper("t125:2181,t126:2181,t127:2181", 5000, null); // 创建一个回调的方法来动态列出路径 listChildren(zk, "/"); } //递归实现列出全部路径 public static void listChildren(ZooKeeper zk, String path) throws Exception { // 打印路径 System.out.println(path); // 调用getchildren方法列出所有子节点 // getchildren(1,路径2,watch事件回调接口我这里没有启用) List<String> cd = zk.getChildren(path, false); // 判断他给出的路径有没有空还是null if (cd == null || cd.isEmpty()) { return; } else { for (String str : cd) { // 判断如果路径是/那么让他路径设置为空以免后面路径拼接容错 if (path.equals("/")) { path = ""; } else { // 递归调用子子节点下的子节点,第二个是路径拼接 listChildren(zk, path + "/" + str); } } } } /** * 给节点赋值 * * @throws Exception */ @Test public void setdatanode() throws Exception { // 创建zookeeper对象使用客户端链接zookeeper集群服务 ZooKeeper zk = new ZooKeeper("t125:2181,t126:2181,t127:2181", 5000, null); // 使用zk对象调用setdata方法 // setData(1,路径2,输入的内容,3,指定添加的版本) zk.setData("/zxz/a", "zxzMV".getBytes(), -1); } /** * 获取节点的数据和一些状态信息 * * @throws Exception */ @Test public void getdatanode() throws Exception { // 创建zookeeper对象使用客户端链接zookeeper集群服务 ZooKeeper zk = new ZooKeeper("t125:2181,t126:2181,t127:2181", 5000, null); // 使用zk对象调用getdata方法 // getdata(1,路径2,watch事件回调接口我这里没有启用,3,创建的一个stat对象用来返回状态,可以指定返回更多的内容,可在stat对象的构造函数里添加默认值) byte[] data = zk.getData("/zxz/a", false, new Stat()); System.out.println(new String(data)); } /** * watch 观察节点是否篡改 * * @throws Exception */ @Test public void Watchnode() throws Exception { Logger log = Logger.getLogger(zktest.class); // 创建zookeeper对象使用客户端链接zookeeper集群服务 ZooKeeper zk = new ZooKeeper("t125:2181,t126:2181,t127:2181", 5000, null); // 创建内部类watch对象,实现他的抽象方法 Watcher wc = new Watcher() { public void process(WatchedEvent event) { try { // 我们观察的路径 String path = event.getPath(); /* * 我们篡改的事件类型 None (-1), 没有节点 NodeCreated (1), 节点创建 NodeDeleted (2), 节点删除 * NodeDataChanged (3), 节点修改 NodeChildrenChanged (4); 节点孩子改变 */ EventType type = event.getType(); // 判断事件的类型是否是删除了,如果删除就之间返回程序 if (type == EventType.NodeDeleted) { System.out.println(path + "节点被删除了,程序需停止" + type); return; } // 打印节点变动的信息 System.out.println(path + "出事了" + type); // 添加日志显示更多的信息 log.info(event.getState()); // 如果这个节点的事件不是删除类型,那么就可以继续检查节点的变动,this调用watch内部类对象 zk.getData("/zxz/a", this, new Stat()); } catch (KeeperException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }; // 这就是和之前的内容一样了,只不过添加了一个watch观察机制 byte[] data = zk.getData("/zxz/a", wc, new Stat()); System.out.println(new String(data)); // 实现死循环不让程序停下来 while (true) { Thread.sleep(5000); } } }
eclipse操作zookeeper api编程
猜你喜欢
转载自blog.csdn.net/weixin_41122339/article/details/81880700
今日推荐
周排行