- 问题:
- 我们发现在zkClient中并没有类似watcher,watch参数,这也就是说我们开发人员无需关心反复注册watcher的问题,zkClient给我们提供了一套监听方式,我们可以使用监听节点的方式进行操作,剔除了繁琐的反复watcher操作,简化了胆码的复杂程度
- subscribeChildChanges方法:
- 参数1:path路径
- 参数2:实现了IZKChildListener接口的类(如:实例化IZKChildListener类)只需要重写其handleChildChanges(String parentPath , List<String> currentChilds)方法。
- 其中参数parentPath为所监听节点的全路径
- currentChilds为最新的子节点列表(相对路径)。
- IZKChildListener事件说明针对于下面三个事件触发:新增子节点、减少子节点、删除节点。
- 代码示例:
package bhz.zkClient.watcher; import java.util.List; import org.I0Itec.zkclient.IZkChildListener; import org.I0Itec.zkclient.ZkClient; import org.I0Itec.zkclient.ZkConnection; public class ZkClientWatcher1 { /** zookeeper地址 */ static final String CONNECT_ADDR = "172.20.10.4:2181"; /** session超时时间 */ static final int SESSION_OUTTIME = 5000;//ms public static void main(String[] args) throws Exception { ZkClient zkc = new ZkClient(new ZkConnection(CONNECT_ADDR), 5000); //对父节点添加监听子节点变化。 zkc.subscribeChildChanges("/super", new IZkChildListener() { //只要实现了监听,就不需要重复监听,一次就够了 @Override public void handleChildChange(String parentPath, List<String> currentChilds) throws Exception { System.out.println("parentPath: " + parentPath); System.out.println("currentChilds: " + currentChilds); System.out.println("------------------------"); } }); Thread.sleep(3000); zkc.createPersistent("/super"); Thread.sleep(1000); //不会监听父节点的updata操作 zkc.writeData("/super","父节点发生变化"); Thread.sleep(1000); zkc.createPersistent("/super" + "/" + "c1", "c1内容"); Thread.sleep(1000); zkc.createPersistent("/super" + "/" + "c2", "c2内容"); Thread.sleep(1000); //不会监听子节点的updata操作 zkc.writeData("/super"+"/"+"c1","新内容"); Thread.sleep(1000); zkc.delete("/super/c2"); Thread.sleep(1000); //递归删除:这里出发了两次,一次是先删除/super/c1触发一次,然后再删除/super再触发一次 zkc.deleteRecursive("/super"); Thread.sleep(Integer.MAX_VALUE); } }
- subscribeDataChanges方法:
- 代码示例:
package bhz.zkClient.watcher; import org.I0Itec.zkclient.IZkDataListener; import org.I0Itec.zkclient.ZkClient; import org.I0Itec.zkclient.ZkConnection; public class ZkClientWatcher2 { /** zookeeper地址 */ static final String CONNECT_ADDR = "172.20.10.4:2181"; /** session超时时间 */ static final int SESSION_OUTTIME = 5000;//ms public static void main(String[] args) throws Exception { ZkClient zkc = new ZkClient(new ZkConnection(CONNECT_ADDR), 5000); zkc.createPersistent("/super", "1234"); //对父节点添加监听子节点变化。 zkc.subscribeDataChanges("/super", new IZkDataListener() { @Override public void handleDataDeleted(String path) throws Exception { System.out.println("删除的节点为:" + path); System.out.println("-----------------"); } @Override public void handleDataChange(String path, Object data) throws Exception { System.out.println("变更的节点为:" + path + ", 变更内容为:" + data); System.out.println("-----------------"); } }); Thread.sleep(3000); //变更节点内容 zkc.writeData("/super", "456", -1); Thread.sleep(1000); //删除节点 zkc.delete("/super"); Thread.sleep(Integer.MAX_VALUE); } }
ZooKeeper的zkClientListener 讲解
最新推荐文章于 2023-08-28 00:15:00 发布