ZooKeeper的zkClientListener 讲解

  • 问题
    • 我们发现在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);
      	}
      }
      

猜你喜欢

转载自blog.csdn.net/Future_LL/article/details/87916123