zookeeper的watch的基础演示demo

匿名 (未验证) 提交于 2019-12-03 00:18:01

前言: 码字辛苦,直接上demo。

一、windows 集群安装

1、复制3分zoo?.cfg的文件 	每份文件分别是 	1.1 zoo1.cfg 	tickTime=2000 	initLimit=10 	syncLimit=5 	dataDir=D:\\zookeeper-3.4.12\\data\\1  //持续递增 	dataLogDir=D:\\zookeeper-3.4.12\\log\\1 //持续递增 	clientPort=2181  //持续递增 	server.1=127.0.0.1:2887:3887 //第一个端口此server和集群中 Leader服务器交换信息的端口,第二个端口是选举端口 	server.2=127.0.0.1:2888:3888 	server.3=127.0.0.1:2889:3889 	1.2 zoo2.cfg 	tickTime=2000 	initLimit=10 	syncLimit=5 	dataDir=D:\\zookeeper-3.4.12\\data\\2 	dataLogDir=D:\\zookeeper-3.4.12\\log\\2 	clientPort=2182 	server.1=127.0.0.1:2887:3887 	server.2=127.0.0.1:2888:3888 	server.3=127.0.0.1:2889:3889 	1.3 zoo3.cfg   略! 	 2、需要复制3个启动脚本.并且指定启动脚本zkServer?.cmd内的增加一个参数 set ZOOCFG=../conf/zoo?.cfg  3、在data/?下创建一个文本文件myid (无后缀)  并且依次填上?的数值  4、启动即可!

二、watch测试demo

package com.wj.base; import java.io.IOException; import org.apache.zookeeper.CreateMode; import org.apache.zookeeper.KeeperException; import org.apache.zookeeper.WatchedEvent; import org.apache.zookeeper.Watcher; import org.apache.zookeeper.ZooDefs.Ids; import org.apache.zookeeper.ZooKeeper; import org.apache.zookeeper.data.Stat; import org.junit.Test;  /**  * Wacth事件触发的演示!  * 一句话攻略: 首先只有3个get类型的方法能够设置触发watch  * 			  exists 触发 目标节点的创建,删除,数据更新  * 			  getData 比较上面----目标节点除了创建。删除,和更新都可以触发  * 			  getChildren 子节点的创建和删除会触发NodeChildrenChanged,以及父节点本身的删除.  */ public class WacthDemo { 	 	private ZooKeeper connection() throws IOException{ 		return new ZooKeeper("localhost:"+2181,10000,new Watcher(){ 			public void process(WatchedEvent event) { 				if(event.getPath()==null){ //连接时会触发None的事件 					System.out.println("初始化连接"+event.getType()); 				}else if(event.getType()==Event.EventType.NodeDeleted){ 					System.out.println("[节点删除]"+event.getPath()+":"+event.getType()); 				}else if(event.getType()==Event.EventType.NodeCreated){ 					System.out.println("[节点创建]"+event.getPath()+":"+event.getType()); 				}else if(event.getType()==Event.EventType.NodeDataChanged){ 					System.out.println("[节点更新]"+event.getPath()+":"+event.getType()); 				}else if(event.getType()==Event.EventType.NodeChildrenChanged){ 					System.out.println("[子节点更新(父增删子节点)]"+event.getPath()+":"+event.getType()); 				} 			} 		}); 	} 	 	/** 	 * 测试exists事件: --> 被监视的Znode创建(create:NodeCreate)、删除(delete:NodeDelete)、更新(setData:NodeDataChange)时被触发。 	 */ 	@Test 	public void test1() throws IOException, KeeperException, InterruptedException{ 		ZooKeeper zk = connection(); 		Stat stat = zk.exists("/root", true); 		if(stat==null){ 			zk.create("/root", new byte[0], Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL); 		} 		Stat stat2 = zk.exists("/root", true); 		if(stat2==null){ 			zk.create("/root", new byte[0], Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL); 		}else{ 			zk.setData("/root", "haha".getBytes(), -1);//-1好像表示全部版本 		} 		//zk.delete("/root",-1); 此时不触发事件,因为一个get类型方法只能触发它对应的事件一次。 		Stat stat3 = zk.exists("/root", true); 		if(stat3!=null){ 			zk.delete("/root",-1); 		} 	} 	 	 	/** 	 * 测试getData事件: --> 被监视的Znode删除(delete:NodeDelete)、更新(setData:NodeDataChange)时被触发。 	 * @throws InterruptedException  	 * @throws KeeperException  	 */ 	@Test 	public void test2() throws IOException, KeeperException, InterruptedException{ 		ZooKeeper zk = connection(); 		Stat stat = zk.exists("/root", false); 		if(stat==null){ 			zk.create("/root", new byte[0], Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL); 		} 		byte[] data1 = zk.getData("/root", true, null); 		System.out.println(new String(data1)); 		zk.setData("/root", "haha".getBytes(), -1); //触发NodeDataChange 		byte[] data2 = zk.getData("/root", true, null); 		System.out.println(new String(data2)); 		zk.delete("/root",-1); 	} 	 	/** 	 * 测试getChildren事件:-->父节点下的子增删 (delete:NodeChildrenChanged) 父节点自己的删除 (delete:NodeDelete) 	 */ 	@Test 	public void test3() throws IOException, KeeperException, InterruptedException{ 		ZooKeeper zk = connection(); 		Stat stat = zk.exists("/root", false); 		if(stat==null){ 			zk.create("/root", new byte[0], Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); 		} 		//--------------------------------------------------------- 		zk.getChildren("/root", true); 		zk.create("/root/children1", new byte[0], Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL); 		zk.getChildren("/root", true); 		zk.create("/root/children2", new byte[0], Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL); 		zk.getChildren("/root", true); 		zk.delete("/root/children1", -1); 		zk.delete("/root/children2", -1); 		zk.getChildren("/root", true); 		zk.delete("/root", -1); /**不能级联删除,要把子节点全删掉!*/ 	}  } 

















标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!