代码示例如下:
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; public class TestZooKeeper { public static void main(String[] args) { ZooKeeper zk = null; try { System.out.println("..."); System.out.println("..."); System.out.println("..."); System.out.println("..."); System.out.println("开始连接ZooKeeper..."); // 创建与ZooKeeper服务器的连接zk String address = "192.168.1.226:2181"; int sessionTimeout = 3000; zk = new ZooKeeper(address, sessionTimeout, new Watcher() { // 监控所有被触发的事件 public void process(WatchedEvent event) { if (event.getType() == null || "".equals(event.getType())) { return; } System.out.println("已经触发了" + event.getType() + "事件!"); } }); System.out.println("ZooKeeper连接创建成功!"); // // 也可以通过register()方法后续注册Watcher // Watcher watcher = new Watcher() { // // @Override // public void process(WatchedEvent event) { // // TODO Auto-generated method stub // System.out.println("后续注册的:已经触发了" + event.getType() + "事件!"); // } // }; // zk.register(watcher); Thread.currentThread().sleep(1000l); System.out.println("..."); System.out.println("..."); System.out.println("..."); System.out.println("..."); // 创建根目录节点 // 路径为/tmp_root_path // 节点内容为字符串"我是根目录/tmp_root_path" // 创建模式为CreateMode.PERSISTENT System.out.println("开始创建根目录节点/tmp_root_path..."); zk.create("/tmp_root_path", "我是根目录/tmp_root_path".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); System.out.println("根目录节点/tmp_root_path创建成功!"); Thread.currentThread().sleep(1000l); System.out.println("..."); System.out.println("..."); System.out.println("..."); System.out.println("..."); // 创建第一个子目录节点 // 路径为/tmp_root_path/childPath1 // 节点内容为字符串"我是第一个子目录/tmp_root_path/childPath1" // 创建模式为CreateMode.PERSISTENT System.out.println("开始创建第一个子目录节点/tmp_root_path/childPath1..."); zk.create("/tmp_root_path/childPath1", "我是第一个子目录/tmp_root_path/childPath1".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); System.out.println("第一个子目录节点/tmp_root_path/childPath1创建成功!"); Thread.currentThread().sleep(1000l); System.out.println("..."); System.out.println("..."); System.out.println("..."); System.out.println("..."); // 获取子目录节点列表 System.out.println("开始获取根目录/tmp_root_path节点的子目录节点列..."); System.out.println(zk.getChildren("/tmp_root_path", true)); System.out.println("根目录/tmp_root_path节点的子目录节点列获取成功!"); Thread.currentThread().sleep(1000l); System.out.println("..."); System.out.println("..."); System.out.println("..."); System.out.println("..."); // 修改子目录节点数据 System.out.println("开始修改第一个子目录节点/tmp_root_path/childPath1数据..."); zk.setData("/tmp_root_path/childPath1", "我是修改数据后的第一个子目录/tmp_root_path/childPath1".getBytes(), -1); System.out.println("修改第一个子目录节点/tmp_root_path/childPath1数据成功!"); Thread.currentThread().sleep(1000l); System.out.println("..."); System.out.println("..."); System.out.println("..."); System.out.println("..."); // 获取根目录节点状态 System.out.println("开始获取根目录节点状态..."); System.out.println(zk.exists("/tmp_root_path", true)); System.out.println("根目录节点状态获取成功"); Thread.currentThread().sleep(1000l); System.out.println("..."); System.out.println("..."); System.out.println("..."); System.out.println("..."); // 创建第二个子目录节点 // 路径为/tmp_root_path/childPath2 // 节点内容为字符串"我是第二个子目录/tmp_root_path/childPath2" // 创建模式为CreateMode.PERSISTENT System.out.println("开始创建第二个子目录节点/tmp_root_path/childPath2..."); zk.create("/tmp_root_path/childPath2", "我是第二个子目录/tmp_root_path/childPath2".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); System.out.println("第二个子目录节点/tmp_root_path/childPath2创建成功!"); Thread.currentThread().sleep(1000l); System.out.println("..."); System.out.println("..."); System.out.println("..."); System.out.println("..."); // 获取第二个子目录节点/tmp_root_path/childPath2节点数据 System.out.println("开始获取第二个子目录节点/tmp_root_path/childPath2节点数据..."); System.out.println(new String(zk.getData( "/tmp_root_path/childPath2", true, null))); System.out.println("第二个子目录节点/tmp_root_path/childPath2节点数据获取成功!"); Thread.currentThread().sleep(1000l); System.out.println("..."); System.out.println("..."); System.out.println("..."); System.out.println("..."); // 获取子目录节点列表 System.out.println("开始获取根目录/tmp_root_path节点的子目录节点列..."); System.out.println(zk.getChildren("/tmp_root_path", true)); System.out.println("根目录/tmp_root_path节点的子目录节点列获取成功!"); Thread.currentThread().sleep(1000l); System.out.println("..."); System.out.println("..."); System.out.println("..."); System.out.println("..."); // 获取根目录节点状态 System.out.println("开始获取根目录节点状态..."); System.out.println(zk.exists("/tmp_root_path", true)); System.out.println("根目录节点状态获取成功"); Thread.currentThread().sleep(1000l); System.out.println("..."); System.out.println("..."); System.out.println("..."); System.out.println("..."); // 删除第一个子目录节点 System.out.println("开始删除第一个子目录节点/tmp_root_path/childPath1..."); zk.delete("/tmp_root_path/childPath1", -1); System.out.println("第一个子目录节点/tmp_root_path/childPath1删除成功!"); Thread.currentThread().sleep(1000l); System.out.println("..."); System.out.println("..."); System.out.println("..."); System.out.println("..."); // 获取根目录节点状态 System.out.println("开始获取根目录节点状态..."); System.out.println(zk.exists("/tmp_root_path", true)); System.out.println("根目录节点状态获取成功"); Thread.currentThread().sleep(1000l); System.out.println("..."); System.out.println("..."); System.out.println("..."); System.out.println("..."); // 删除第二个子目录节点 System.out.println("开始删除第二个子目录节点/tmp_root_path/childPath2..."); zk.delete("/tmp_root_path/childPath2", -1); System.out.println("第二个子目录节点/tmp_root_path/childPath2删除成功!"); Thread.currentThread().sleep(1000l); System.out.println("..."); System.out.println("..."); System.out.println("..."); System.out.println("..."); // 获取根目录节点状态 System.out.println("开始获取根目录节点状态..."); System.out.println(zk.exists("/tmp_root_path", true)); System.out.println("根目录节点状态获取成功"); Thread.currentThread().sleep(1000l); System.out.println("..."); System.out.println("..."); System.out.println("..."); System.out.println("..."); // 删除根目录节点 System.out.println("开始删除根目录节点/tmp_root_path..."); zk.delete("/tmp_root_path", -1); System.out.println("根目录节点/tmp_root_path删除成功!"); Thread.currentThread().sleep(1000l); System.out.println("..."); System.out.println("..."); System.out.println("..."); System.out.println("..."); // 获取根目录节点状态 System.out.println("开始获取根目录节点状态..."); System.out.println(zk.exists("/tmp_root_path", true)); System.out.println("根目录节点状态获取成功"); Thread.currentThread().sleep(1000l); System.out.println("..."); System.out.println("..."); System.out.println("..."); System.out.println("..."); } catch (IOException | KeeperException | InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { // 关闭连接 if (zk != null) { try { zk.close(); System.out.println("释放ZooKeeper连接成功!"); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } }输出结果如下:
... ... ... ... 开始连接ZooKeeper... ZooKeeper连接创建成功! 已经触发了None事件! ... ... ... ... 开始创建根目录节点/tmp_root_path... 根目录节点/tmp_root_path创建成功! ... ... ... ... 开始创建第一个子目录节点/tmp_root_path/childPath1... 第一个子目录节点/tmp_root_path/childPath1创建成功! ... ... ... ... 开始获取根目录/tmp_root_path节点的子目录节点列... [childPath1] 根目录/tmp_root_path节点的子目录节点列获取成功! ... ... ... ... 开始修改第一个子目录节点/tmp_root_path/childPath1数据... 修改第一个子目录节点/tmp_root_path/childPath1数据成功! ... ... ... ... 开始获取根目录节点状态... 2006956,2006956,1458958753172,1458958753172,0,1,0,0,29,1,2006957 根目录节点状态获取成功 ... ... ... ... 开始创建第二个子目录节点/tmp_root_path/childPath2... 已经触发了NodeChildrenChanged事件! 第二个子目录节点/tmp_root_path/childPath2创建成功! ... ... ... ... 开始获取第二个子目录节点/tmp_root_path/childPath2节点数据... 我是第二个子目录/tmp_root_path/childPath2 第二个子目录节点/tmp_root_path/childPath2节点数据获取成功! ... ... ... ... 开始获取根目录/tmp_root_path节点的子目录节点列... [childPath2, childPath1] 根目录/tmp_root_path节点的子目录节点列获取成功! ... ... ... ... 开始获取根目录节点状态... 2006956,2006956,1458958753172,1458958753172,0,2,0,0,29,2,2006959 根目录节点状态获取成功 ... ... ... ... 开始删除第一个子目录节点/tmp_root_path/childPath1... 已经触发了NodeChildrenChanged事件! 第一个子目录节点/tmp_root_path/childPath1删除成功! ... ... ... ... 开始获取根目录节点状态... 2006956,2006956,1458958753172,1458958753172,0,3,0,0,29,1,2006960 根目录节点状态获取成功 ... ... ... ... 开始删除第二个子目录节点/tmp_root_path/childPath2... 已经触发了NodeDeleted事件! 第二个子目录节点/tmp_root_path/childPath2删除成功! ... ... ... ... 开始获取根目录节点状态... 2006956,2006956,1458958753172,1458958753172,0,4,0,0,29,0,2006961 根目录节点状态获取成功 ... ... ... ... 开始删除根目录节点/tmp_root_path... 已经触发了NodeDeleted事件! 根目录节点/tmp_root_path删除成功! ... ... ... ... 开始获取根目录节点状态... null 根目录节点状态获取成功 ... ... ... ... 释放ZooKeeper连接成功!至于为啥Watcher会监控那些,以后再做分析!