zookeeper实践之使用JavaAPI 一

it2026-01-05  6

zookeeper使用javaAPI

一、 创建一个mawen项目1、添加依赖 二、连接zookeeper1、创建ZookeeperConnection类2、运行出现了异常:3、解决办法 三、新增节点四、更新节点五、删除节点六、查看节点七、查看子节点八、检查节点是否存在九、注册watcher的方法客户端与服务器的连接状态检查节点是否存在

一、 创建一个mawen项目

1、添加依赖

<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.csii.wyw</groupId> <artifactId>zookeeperJavaAPI</artifactId> <version>1.0-SNAPSHOT</version> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> </dependency> <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3.5.8</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.25</version> </dependency> </dependencies> </project>

文章目录

一、 创建一个mawen项目1、添加依赖 二、连接zookeeper1、创建ZookeeperConnection类2、运行出现了异常:3、解决办法 三、新增节点四、更新节点五、删除节点六、查看节点七、查看子节点八、检查节点是否存在九、注册watcher的方法客户端与服务器的连接状态检查节点是否存在


二、连接zookeeper

1、创建ZookeeperConnection类

import org.apache.zookeeper.WatchedEvent; import org.apache.zookeeper.Watcher; import org.apache.zookeeper.ZooKeeper; import java.util.concurrent.CountDownLatch; public class ZookeeperConnection { public static void main(String[] args) { try { //计数器对象 final CountDownLatch countDownLatch = new CountDownLatch(1); /** * arg1:服务器的ip和端口 * arg2:客户端与服务器之间的会话超时时间 以毫秒为单位 * arg3:监视器对象 */ ZooKeeper zooKeeper = new ZooKeeper("192.168.191.128:2181", 5000, new Watcher() { public void process(WatchedEvent watchedEvent) { if (watchedEvent.getState() == Event.KeeperState.SyncConnected){ System.out.println("连接成功"); countDownLatch.countDown(); } } }); //主线程阻塞等待连接对象的创建成功 countDownLatch.await(); //会话编号 System.out.println(zooKeeper.getSessionId()); zooKeeper.close(); }catch (Exception e){ e.printStackTrace(); } } }

2、运行出现了异常:

3、解决办法

百度了一下,原因是Linux防火墙没关闭 关闭防火墙

查看已开启的端口 firewall-cmd --list-ports 查看防火墙状态 firewall-cmd --state 开启状态:running 关闭状态:not running 2.关闭防火墙: systemctl stop firewalld.service 3.开机不启动防火墙: systemctl disable firewalld.service 开启防火墙 systemctl start firewalld 开启端口 firewall-cmd --zone=public --add-port=6379/tcp --permanent 重启防火墙 firewall-cmd --reload

关闭防火墙后就能连接上了

三、新增节点

1、同步方式 create(String path,byte[] data,List acl,CreateMode createMode) 2、异步方式 create(String path,byte[] data,List acl,CreateMode createMode,AsyncCallback.StringCallback callBack,Object ctx)

path -znode路径。例如, /create/node1data -要存储在指定znode路径中的数据acl -要创建的节点的访问控制列表。zookeeper API提供了一个静态接口ZooDefs.Ids来获取一些基本的acl列表。例如,ZooDefs.Ids.OPEN_ACL_UNSAFE返回打开znode的acl列表。createMode-节点的类型,这是一个枚举。callBack-异步回调接口ctx-传递上下文参数

案例:

package com.csii.javaapi; import org.apache.zookeeper.*; import org.junit.After; import org.junit.Before; import org.junit.Test; import java.util.concurrent.CountDownLatch; public class ZKCreate { String IP = "192.168.191.128:2181"; ZooKeeper zooKeeper; @Before public void before() throws Exception { System.out.println("before"); //计数器对象 final CountDownLatch countDownLatch = new CountDownLatch(1); /** * arg1:服务器的ip和端口 * arg2:客户端与服务器之间的会话超时时间 以毫秒为单位 * arg3:监视器对象 */ zooKeeper = new ZooKeeper(IP, 5000, new Watcher() { @Override public void process(WatchedEvent watchedEvent) { if (watchedEvent.getState() == Event.KeeperState.SyncConnected) { System.out.println("连接成功"); countDownLatch.countDown(); } } }); //主线程阻塞等待连接对象的创建成功 countDownLatch.await(); } @After public void after() throws Exception { zooKeeper.close(); } @Test public void create1() throws Exception { /** * arg1:节点的路径 * arg2:节点的数据 * arg3:权限列表 world:anyone:cdrwa * arg4:节点类型 持久化节点 */ zooKeeper.create("/create/node1","node1".getBytes(),ZooDefs.Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT); } @Test public void create2() throws Exception { // READ_ACL_UNSAFE world:anyone:r zooKeeper.create("/create/node2", "node2".getBytes(), ZooDefs.Ids.READ_ACL_UNSAFE, CreateMode.PERSISTENT); } @Test public void create3() throws Exception { // world授权模式 // 权限列表 List<ACL> acls = new ArrayList<>(); //授权模式和授权对象 Id id = new Id("world", "anyone"); //权限设置 acls.add(new ACL(ZooDefs.Perms.READ, id)); acls.add(new ACL(ZooDefs.Perms.WRITE, id)); zooKeeper.create("/create/node3", "node3".getBytes(), acls, CreateMode.PERSISTENT); } @Test public void create4() throws Exception { // ip授权模式 // 权限列表 List<ACL> acls = new ArrayList<>(); //授权模式和授权对象 Id id = new Id("ip", "192.168.191.128"); //权限设置 acls.add(new ACL(ZooDefs.Perms.ALL, id)); zooKeeper.create("/create/node4", "node4".getBytes(), acls, CreateMode.PERSISTENT); } @Test public void create5() throws Exception { // auth授权模式 // 添加授权用户 zooKeeper.addAuthInfo("digest","itcast:123456".getBytes()); //权限设置 zooKeeper.create("/create/node5", "node5".getBytes(), ZooDefs.Ids.CREATOR_ALL_ACL, CreateMode.PERSISTENT); } /** * [zk: localhost:2181(CONNECTED) 8] get /create/node5 * org.apache.zookeeper.KeeperException$NoAuthException: KeeperErrorCode = NoAuth for /create/node5 * [zk: localhost:2181(CONNECTED) 9] addauth digest itcast:123456 * [zk: localhost:2181(CONNECTED) 10] get /create/node5 * node5 * [zk: localhost:2181(CONNECTED) 11] getAcl /create/node5 * 'digest,'itcast:673OfZhUE8JEFMcu0l64qI8e5ek= * : cdrwa * [zk: localhost:2181(CONNECTED) 12] */ @Test public void create6() throws Exception { // auth授权模式 // 添加授权用户 zooKeeper.addAuthInfo("digest","itcast:123456".getBytes()); //权限列表 List<ACL> acls = new ArrayList<>(); //授权模式和授权对象 Id id = new Id("auth","itcast"); //权限设置 acls.add(new ACL(ZooDefs.Perms.READ,id)); zooKeeper.create("/create/node6", "node6".getBytes(),acls, CreateMode.PERSISTENT); } @Test public void create7() throws Exception { // digest授权模式 //权限列表 List<ACL> acls = new ArrayList<>(); //授权模式和授权对象 Id id = new Id("digest","itcast:673OfZhUE8JEFMcu0l64qI8e5ek="); //权限设置 acls.add(new ACL(ZooDefs.Perms.ALL,id)); zooKeeper.create("/create/node7", "node7".getBytes(),acls, CreateMode.PERSISTENT); } @Test public void create8() throws Exception { // 持久化顺序节点 // OPEN_ACL_UNSAFE world:anyone:cdrwa String result = zooKeeper.create("/create/node8", "node8".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT_SEQUENTIAL); System.out.println(result); } @Test public void create9() throws Exception { /** * EPHEMERAL 临时节点 * 换成EPHEMERAL_SEQUENTIAL 则是 临时顺序节点 */ // 临时节点 // OPEN_ACL_UNSAFE world:anyone:cdrwa String result = zooKeeper.create("/create/node9", "node9".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL); System.out.println(result); } @Test public void create10() throws Exception { /** * 异步方式创建节点 */ zooKeeper.create("/create/node10", "node10".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT, new AsyncCallback.StringCallback() { @Override public void processResult(int rc, String path, Object ctx, String name) { // 0代表创建成功 System.out.println(rc); //节点的路径 System.out.println(path); //节点的名称 System.out.println(name); //上下文参数 System.out.println(ctx); } }, "I am context"); Thread.sleep(10000); System.out.println("结束"); } }

四、更新节点

同步方式 setData(String path,byte[] data,int version) 异步方式 setData(String path,byte[] data,int version,AsyncCallback.StatCallack callBack,Object ctx)

path -znode路径data-要存储在指定znode路径中的数据version -znode的当前版本。每当数据更新时, Zookeeper会更新znode的版本号callBack-异步回调接口ctx-传递上下文参数 package com.csii.javaapi; import org.apache.zookeeper.AsyncCallback; import org.apache.zookeeper.WatchedEvent; import org.apache.zookeeper.Watcher; import org.apache.zookeeper.ZooKeeper; import org.apache.zookeeper.data.Stat; import org.junit.After; import org.junit.Before; import org.junit.Test; import java.util.concurrent.CountDownLatch; public class ZKSet { String IP = "192.168.191.128:2181"; ZooKeeper zooKeeper; @Before public void before() throws Exception { System.out.println("before"); //计数器对象 final CountDownLatch countDownLatch = new CountDownLatch(1); /** * arg1:服务器的ip和端口 * arg2:客户端与服务器之间的会话超时时间 以毫秒为单位 * arg3:监视器对象 */ zooKeeper = new ZooKeeper(IP, 5000, new Watcher() { @Override public void process(WatchedEvent watchedEvent) { if (watchedEvent.getState() == Event.KeeperState.SyncConnected) { System.out.println("连接成功"); countDownLatch.countDown(); } } }); //主线程阻塞等待连接对象的创建成功 countDownLatch.await(); } @After public void after() throws Exception { zooKeeper.close(); } @Test public void set1() throws Exception { //arg1:节点的路径 //arg2:修改的数据 //arg3:数据版本号 -1代表版本号不参与更新 //zooKeeper.setData("/set/node1","node11".getBytes(),-1); //使用Stat可以获取节点的详细信息 Stat stat = zooKeeper.setData("/set/node1", "node12".getBytes(), -1); System.out.println(stat.getVersion()); } @Test public void set2() throws Exception { zooKeeper.setData("/set/node1", "node13".getBytes(), -1, new AsyncCallback.StatCallback() { @Override public void processResult(int rc, String path, Object ctx, Stat stat) { //0代表成功 System.out.println(rc); //节点的路径 System.out.println(path); //上下文描述的对象 System.out.println(ctx); //属性描述对象 System.out.println(stat.getVersion()); } },"I am contex"); Thread.sleep(10000); System.out.println("结束"); } }

五、删除节点

同步方式 delete(String path,int version)

异步方式 delete(String path,int version,AsyncCallback.VoidCallbck callBack,Object ctx)

path -znode路径version -znode的当前版本callBack - 异步回调接口ctx -传递上下文参数 package com.csii.javaapi; import org.apache.zookeeper.AsyncCallback; import org.apache.zookeeper.WatchedEvent; import org.apache.zookeeper.Watcher; import org.apache.zookeeper.ZooKeeper; import org.junit.After; import org.junit.Before; import org.junit.Test; import java.util.concurrent.CountDownLatch; public class ZKDelete { String IP = "192.168.191.128:2181"; ZooKeeper zooKeeper; @Before public void before() throws Exception { System.out.println("before"); //计数器对象 final CountDownLatch countDownLatch = new CountDownLatch(1); /** * arg1:服务器的ip和端口 * arg2:客户端与服务器之间的会话超时时间 以毫秒为单位 * arg3:监视器对象 */ zooKeeper = new ZooKeeper(IP, 5000, new Watcher() { @Override public void process(WatchedEvent watchedEvent) { if (watchedEvent.getState() == Event.KeeperState.SyncConnected) { System.out.println("连接成功"); countDownLatch.countDown(); } } }); //主线程阻塞等待连接对象的创建成功 countDownLatch.await(); } @After public void after() throws Exception { zooKeeper.close(); } @Test public void delete1() throws Exception { //arg1 删除节点的节点路径 //arg2 要数据版本信息,-1代表删除节点时不考虑版本信息 zooKeeper.delete("/delete/node1",-1); } @Test public void delete2() throws Exception { zooKeeper.delete("/delete/node2", -1, new AsyncCallback.VoidCallback() { @Override public void processResult(int rc, String path, Object ctx) { //0代表成功 System.out.println(rc); //节点的路径 System.out.println(path); //上下文描述的对象 System.out.println(ctx); } },"I am context"); Thread.sleep(10000); System.out.println("结束"); } }

六、查看节点

同步方式

getData(String path,boolean b,Stat stat);

异步方式

getData(String path,boolean b,AsyncCallback.DataCallback callBack,Object ctx); path -znode路径b -是否使用连接对象中注册的监视器stat - 返回znode的元数据callBack -异步回调接口ctx -传递上下文参数 package com.csii.javaapi; import java.lang.String; import org.apache.zookeeper.AsyncCallback; import org.apache.zookeeper.WatchedEvent; import org.apache.zookeeper.Watcher; import org.apache.zookeeper.ZooKeeper; import org.apache.zookeeper.data.Stat; import org.junit.After; import org.junit.Before; import org.junit.Test; import java.util.concurrent.CountDownLatch; public class ZKGet { String IP = "192.168.191.128:2181"; ZooKeeper zooKeeper; @Before public void before() throws Exception { System.out.println("before"); //计数器对象 final CountDownLatch countDownLatch = new CountDownLatch(1); /** * arg1:服务器的ip和端口 * arg2:客户端与服务器之间的会话超时时间 以毫秒为单位 * arg3:监视器对象 */ zooKeeper = new ZooKeeper(IP, 5000, new Watcher() { @Override public void process(WatchedEvent watchedEvent) { if (watchedEvent.getState() == Event.KeeperState.SyncConnected) { System.out.println("连接成功"); countDownLatch.countDown(); } } }); //主线程阻塞等待连接对象的创建成功 countDownLatch.await(); } @After public void after() throws Exception { zooKeeper.close(); } @Test public void get1() throws Exception { //arg1:节点的路径 //arg3: 读取节点属性的对象 Stat stat = new Stat(); byte[] bys = zooKeeper.getData("/get/node1",false,stat); //打印数据 System.out.println(new String (bys)); //版本信息 System.out.println(stat.getVersion()); } @Test public void get2() throws Exception { //异步方式 zooKeeper.getData("/get/node1", false, new AsyncCallback.DataCallback() { @Override public void processResult(int rc, String path, Object ctx, byte[] data, Stat stat) { //0代表成功 System.out.println(rc); //节点的路径 System.out.println(path); //上下文描述的对象 System.out.println(ctx); //数据 System.out.println(new String(data)); //属性对象 System.out.println(stat.getVersion()); } },"I am contex"); } }

七、查看子节点

同步方式

getChildren(String path,boolean b);

异步方式

getData(String path,boolean b,AsyncCallback.ChildrenCallback callBack,Object ctx); path -znode路径b -是否使用连接对象中注册的监视器callBack -异步回调接口ctx -传递上下文参数 package com.csii.javaapi; import org.apache.zookeeper.AsyncCallback; import org.apache.zookeeper.WatchedEvent; import org.apache.zookeeper.Watcher; import org.apache.zookeeper.ZooKeeper; import org.junit.After; import org.junit.Before; import org.junit.Test; import java.util.List; import java.util.concurrent.CountDownLatch; public class ZKGetChild { String IP = "192.168.191.128:2181"; ZooKeeper zooKeeper; @Before public void before() throws Exception { System.out.println("before"); //计数器对象 final CountDownLatch countDownLatch = new CountDownLatch(1); /** * arg1:服务器的ip和端口 * arg2:客户端与服务器之间的会话超时时间 以毫秒为单位 * arg3:监视器对象 */ zooKeeper = new ZooKeeper(IP, 5000, new Watcher() { @Override public void process(WatchedEvent watchedEvent) { if (watchedEvent.getState() == Event.KeeperState.SyncConnected) { System.out.println("连接成功"); countDownLatch.countDown(); } } }); //主线程阻塞等待连接对象的创建成功 countDownLatch.await(); } @After public void after() throws Exception { zooKeeper.close(); } @Test public void get1() throws Exception { //arg1:节点的路径 List<String> list = zooKeeper.getChildren("/get",false); for (String str:list ) { System.out.println(str); } } @Test public void get2() throws Exception { //异步用法 zooKeeper.getChildren("/get", false, new AsyncCallback.ChildrenCallback() { @Override public void processResult(int rc, String path, Object ctx, List<String> list) { //0代表成功 System.out.println(rc); //节点的路径 System.out.println(path); //上下文描述的对象 System.out.println(ctx); //数据 for (String str:list ) { System.out.println(str); } } },"I am Context"); Thread.sleep(10000); System.out.println("结束"); } }

八、检查节点是否存在

同步方式

exists(String path,boolean b);

异步方式

exists(String path,boolean b,AsyncCallback.StatCallback callBack,Object ctx); path -znode路径b -是否使用连接对象中注册的监视器callBack -异步回调接口ctx -传递上下文参数

案例:

package com.csii.javaapi; import org.apache.zookeeper.AsyncCallback; import org.apache.zookeeper.WatchedEvent; import org.apache.zookeeper.Watcher; import org.apache.zookeeper.ZooKeeper; import org.apache.zookeeper.data.Stat; import org.junit.After; import org.junit.Before; import org.junit.Test; import java.util.concurrent.CountDownLatch; public class ZKExists { String IP = "192.168.191.128:2181"; ZooKeeper zooKeeper; @Before public void before() throws Exception { System.out.println("before"); //计数器对象 final CountDownLatch countDownLatch = new CountDownLatch(1); /** * arg1:服务器的ip和端口 * arg2:客户端与服务器之间的会话超时时间 以毫秒为单位 * arg3:监视器对象 */ zooKeeper = new ZooKeeper(IP, 5000, new Watcher() { @Override public void process(WatchedEvent watchedEvent) { if (watchedEvent.getState() == Event.KeeperState.SyncConnected) { System.out.println("连接成功"); countDownLatch.countDown(); } } }); //主线程阻塞等待连接对象的创建成功 countDownLatch.await(); } @After public void after() throws Exception { zooKeeper.close(); } @Test public void exists1() throws Exception { //arg1:节点的路径 Stat stat = zooKeeper.exists("/exists",false); System.out.println(stat.getVersion()); } @Test public void exists2() throws Exception { //arg1:节点的路径 zooKeeper.exists("/exists", false, new AsyncCallback.StatCallback() { @Override public void processResult(int rc, String path, Object ctx, Stat stat) { //0代表成功 System.out.println(rc); //节点的路径 System.out.println(path); //上下文参数 System.out.println(ctx); //节点的版本信息 System.out.println(stat.getVersion()); } },"I am Context"); Thread.sleep(10000); System.out.println("结束"); } }

九、注册watcher的方法

客户端与服务器的连接状态

keeperState 通知状态 SyncConnected:客户端与服务器正常连接时 Disconnected:客户端与服务器断开连接时 Expired:会话session失效时 Authfailed:身份认证失败时

事件类型为:None

package com.csii.javaapi.watcher; import org.apache.zookeeper.WatchedEvent; import org.apache.zookeeper.Watcher; import org.apache.zookeeper.ZooKeeper; import java.util.concurrent.CountDownLatch; public class ZKConnectionWatcher implements Watcher { /** * 计数器对象 */ static CountDownLatch countDownLatch = new CountDownLatch(1); /** * 连接对象 */ static ZooKeeper zooKeeper; @Override public void process(WatchedEvent event) { try { //事件类型 if (event.getType() == Event.EventType.None) { if (event.getState() == Event.KeeperState.SyncConnected) { System.out.println("连接创建成功"); countDownLatch.countDown(); } else if (event.getState() == Event.KeeperState.Disconnected) { System.out.println("断开连接"); } else if (event.getState() == Event.KeeperState.Expired) { System.out.println("会话超时!"); zooKeeper = new ZooKeeper("192.168.191.128:2181", 5000, new ZKConnectionWatcher()); } else if (event.getState() == Event.KeeperState.AuthFailed) { System.out.println("认证失败!"); } } } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) { try { zooKeeper = new ZooKeeper("192.168.191.128:2181", 5000, new ZKConnectionWatcher()); //阻塞线程等待连接的创建 countDownLatch.await(); //会话id System.out.println(zooKeeper.getSessionId()); //添加授权用户 zooKeeper.addAuthInfo("digest", "itcast:123456".getBytes()); byte[] bys = zooKeeper.getData("/node1", false, null); System.out.println(new String(bys)); Thread.sleep(50000); zooKeeper.close(); System.out.println("结束"); } catch (Exception e) { e.printStackTrace(); } } }

检查节点是否存在

使用连接对象的监视器 exists(String path,boolean b) 自定义监视器 exists(String path,Watcher w)

//NodeCreated:节点创建 //NodeDeleted:节点删除 //NodeDataChanged:节点内容发上变化

path -znode路径

b -是否使用连接对象中注册的监视器w -监视器对象

案例:

package com.csii.javaapi.watcher; import org.apache.zookeeper.WatchedEvent; import org.apache.zookeeper.Watcher; import org.apache.zookeeper.ZooKeeper; import org.junit.After; import org.junit.Before; import org.junit.Test; import java.util.concurrent.CountDownLatch; public class ZKWatcherExists { String IP = "192.168.191.128:2181"; ZooKeeper zooKeeper; @Before public void before() throws Exception { System.out.println("before"); //计数器对象 final CountDownLatch countDownLatch = new CountDownLatch(1); /** * arg1:服务器的ip和端口 * arg2:客户端与服务器之间的会话超时时间 以毫秒为单位 * arg3:监视器对象 */ zooKeeper = new ZooKeeper(IP, 5000, new Watcher() { @Override public void process(WatchedEvent watchedEvent) { System.out.println("连接对象的参数"); if (watchedEvent.getState() == Event.KeeperState.SyncConnected) { System.out.println("连接成功"); countDownLatch.countDown(); } System.out.println("path=" + watchedEvent.getPath()); System.out.println("evenType=" + watchedEvent.getType()); } }); //主线程阻塞等待连接对象的创建成功 countDownLatch.await(); } @After public void after() throws Exception { zooKeeper.close(); } @Test public void watcherExists1() throws Exception { //arg1:节点的路径 //arg2:使用连接对象中的watcher zooKeeper.exists("/watcher1", true); Thread.sleep(50000); System.out.println("结束"); } @Test public void watcherExists2() throws Exception { //arg1:节点的路径 //arg2:自定义watcher对象 zooKeeper.exists("/watcher1", new Watcher() { @Override public void process(WatchedEvent watchedEvent) { System.out.println("自定义watcher"); System.out.println("path=" + watchedEvent.getPath()); System.out.println("evenType=" + watchedEvent.getType()); } }); Thread.sleep(50000); System.out.println("结束"); } @Test public void watcherExists3() throws Exception { //watcher是一次性的 Watcher watcher = new Watcher() { @Override public void process(WatchedEvent watchedEvent) { try { System.out.println("自定义watcher"); System.out.println("path=" + watchedEvent.getPath()); System.out.println("evenType=" + watchedEvent.getType()); //可以通过在process方法中加入zooKeeper对象实现多次监听 zooKeeper.exists("/watcher1",this); }catch (Exception e){ e.printStackTrace(); } } }; zooKeeper.exists("/watcher1",watcher); Thread.sleep(80000); System.out.println("结束"); } @Test public void watcherExists4() throws Exception { //注册多个监听器对象 zooKeeper.exists("/watcher1", new Watcher() { @Override public void process(WatchedEvent watchedEvent) { System.out.println("自定义watcher1"); System.out.println("path=" + watchedEvent.getPath()); System.out.println("evenType=" + watchedEvent.getType()); } }); zooKeeper.exists("/watcher1", new Watcher() { @Override public void process(WatchedEvent watchedEvent) { System.out.println("自定义watcher2"); System.out.println("path=" + watchedEvent.getPath()); System.out.println("evenType=" + watchedEvent.getType()); } }); Thread.sleep(80000); System.out.println("结束"); } }
最新回复(0)