用java原生api实现对zookeeper的增、删、改、查,watcher实在太难用了,建议用curator或zkclient
<dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3.4.6</version> </dependency>
public class ZookeeperJavaApiDemo implements Watcher{ private static String ZK_URL = "192.168.1.45:2181,192.168.1.46:2181,192.168.1.41:2181"; private static CountDownLatch countDownLatch=new CountDownLatch(1); private static ZooKeeper zookeeper; private static Stat stat=new Stat(); public static void main(String[] args) throws Exception { zookeeper = new ZooKeeper(ZK_URL, 6000, new ZookeeperJavaApiDemo()); countDownLatch.await(); //增 String result = zookeeper.create("/zktest", "123".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); zookeeper.getData(result,new ZookeeperJavaApiDemo(),stat); System.out.println("创建成功!返回值为:"+result); TimeUnit.SECONDS.sleep(2); //改 Stat stat = zookeeper.setData(result, "update".getBytes(), -1); System.out.println(stat); TimeUnit.SECONDS.sleep(2); //删除 zookeeper.delete(result,-1); TimeUnit.SECONDS.sleep(2); //创建节点和子节点 String path="/node"; zookeeper.create(path,"123".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT); TimeUnit.SECONDS.sleep(2); stat=zookeeper.exists(path+"/node1",true); if(stat==null){//表示节点不存在 zookeeper.create(path+"/node1","123".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT); TimeUnit.SECONDS.sleep(2); } //修改子路径 zookeeper.setData(path+"/node1","234".getBytes(),-1); TimeUnit.SECONDS.sleep(2); List<String> children = zookeeper.getChildren(path, true); System.out.println(children); zookeeper.delete(path+"/node1",-1); TimeUnit.SECONDS.sleep(2); zookeeper.delete(path,-1); TimeUnit.SECONDS.sleep(2); } public void process(WatchedEvent watchedEvent) { if (watchedEvent.getState() == Event.KeeperState.SyncConnected){ if (Event.EventType.None==watchedEvent.getType() && null==watchedEvent.getPath()){ countDownLatch.countDown(); System.out.println("连接成功!"); System.out.println(watchedEvent.getState()+"-->"+watchedEvent.getType()); }else if(watchedEvent.getType()== Event.EventType.NodeDataChanged){ try { System.out.println("数据变更触发路径:"+watchedEvent.getPath()+"->改变后的值:"+ zookeeper.getData(watchedEvent.getPath(),true,stat)); } catch (KeeperException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } }else if(watchedEvent.getType()== Event.EventType.NodeChildrenChanged){//子节点的数据变化会触发 try { System.out.println("子节点数据变更路径:"+watchedEvent.getPath()+"->节点的值:"+ zookeeper.getData(watchedEvent.getPath(),true,stat)); } catch (KeeperException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } }else if(watchedEvent.getType()== Event.EventType.NodeCreated){//创建子节点的时候会触发 try { System.out.println("节点创建路径:"+watchedEvent.getPath()+"->节点的值:"+ zookeeper.getData(watchedEvent.getPath(),true,stat)); } catch (KeeperException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } }else if(watchedEvent.getType()== Event.EventType.NodeDeleted){//子节点删除会触发 System.out.println("节点删除路径:"+watchedEvent.getPath()); } } } }