eclipse操作zookeeper api编程

本文介绍了,使用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);
		}

	}

}

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值