前言: 码字辛苦,直接上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); /**不能级联删除,要把子节点全删掉!*/ } }
文章来源: zookeeper的watch的基础演示demo