zookeeper watch

zookeeper基本操作

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 ZkConn {
  public static void main(String[] args)
    throws IOException, KeeperException, InterruptedException {
    ZooKeeper zk = null;
    try{
      /**
       *  创建一个与服务器的连接
       *  参数一:服务器地址和端口号(该端口号值服务器允许客户端连接的端口号)
       *  参数二:连接会话超时时间
       *  参数三:观察者,连接成功会触发该观察者。不过只会触发一次。
       *      该Watcher会获取各种事件的通知
       */
       zk = new ZooKeeper("kafka3:2181", 60000, new Watcher() {
        // 监控所有被触发的事件
        @Override
        public void process(WatchedEvent event) {
          System.out.println("监控所有被触发的事件:EVENT:" + event.getType());
        }
      });
      System.out.println("*******************************************************");
      // 查看根节点的子节点
      System.out.println("查看根节点的子节点:ls / => " + zk.getChildren("/", true));
      System.out.println("*******************************************************");
      // 创建一个目录节点
      if (zk.exists("/node", true) == null) {
        /**
         * 参数一:路径地址
         * 参数二:想要保存的数据,需要转换成字节数组
         * 参数三:ACL访问控制列表(Access control list),
         *      参数类型为ArrayList<ACL>,Ids接口提供了一些默认的值可以调用。
         *      OPEN_ACL_UNSAFE     This is a completely open ACL
         *                          这是一个完全开放的ACL,不安全
         *      CREATOR_ALL_ACL     This ACL gives the
         *                           creators authentication id's all permissions.
         *                          这个ACL赋予那些授权了的用户具备权限
         *      READ_ACL_UNSAFE     This ACL gives the world the ability to read.
         *                          这个ACL赋予用户读的权限,也就是获取数据之类的权限。
         * 参数四:创建的节点类型。枚举值CreateMode
         *      PERSISTENT (0, false, false)
         *      PERSISTENT_SEQUENTIAL (2, false, true)
         *          这两个类型创建的都是持久型类型节点,回话结束之后不会自动删除。
         *          区别在于,第二个类型所创建的节点名后会有一个单调递增的数值
         *      EPHEMERAL (1, true, false)
         *      EPHEMERAL_SEQUENTIAL (3, true, true)
         *          这两个类型所创建的是临时型类型节点,在回话结束之后,自动删除。
         *          区别在于,第二个类型所创建的临时型节点名后面会有一个单调递增的数值。
         * 最后create()方法的返回值是创建的节点的实际路径
         */
        zk.create("/node", "conan".getBytes(),
          Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
        System.out.println("创建一个目录节点:create /node conan");
        /**
         *  查看/node节点数据,这里应该输出"conan"
         *  参数一:获取节点的路径
         *  参数二:说明是否需要观察该节点,设置为true,则设定共享默认的观察器
         *  参数三:stat类,保存节点的信息。例如数据版本信息,创建时间,修改时间等信息
         */
        System.out.println("查看/node节点数据:get /node => "
          + new String(zk.getData("/node", false, null)));
        /**
         * 查看根节点
         * 在此查看根节点的值,这里应该输出上面所创建的/node节点
         */
        System.out.println("查看根节点:ls / => " + zk.getChildren("/", true));
      }
      System.out.println("*******************************************************");
      // 创建一个子目录节点
      if (zk.exists("/node/sub1", true) == null) {
        zk.create("/node/sub1", "sub1".getBytes(),
          Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
        System.out.println("创建一个子目录节点:create /node/sub1 sub1");
        // 查看node节点
        System.out.println("查看node节点:ls /node => "
          + zk.getChildren("/node", true));
      }
      System.out.println("*******************************************************");
      // 创建一个子目录节点
      if (zk.exists("/node/sub1/sub2", true) == null) {
        zk.create("/node/sub1/sub2", "sub2".getBytes(),
          Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
        System.out.println("创建一个子目录节点:create /node/sub1/sub2 sub2");
        // 查看node节点
        System.out.println("查看node节点:ls /node => "
          + zk.getChildren("/node/sub1", true));
      }
      System.out.println("*******************************************************");
      if (zk.exists("/node/sub1/sub2-1", true) == null) {
        zk.create("/node/sub1/sub2-1", "sub2".getBytes(),
          Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
        System.out.println("创建一个子目录节点:create /node/sub1/sub2-1 sub2");
        // 查看node节点
        System.out.println("查看node节点:ls /node => "
          + zk.getChildren("/node/sub1", true));
      }
      System.out.println("*******************************************************");

      /**
       *  修改节点数据
       *  修改的数据会覆盖上次所设置的数据
       *  setData()方法参数一、参数二不多说,与上面类似。
       *  参数三:数值型。需要传入该界面的数值类型版本号!!!
       *      该信息可以通过Stat类获取,也可以通过命令行获取。
       *      如果该值设置为-1,就是忽视版本匹配,直接设置节点保存的值。
       */
      if (zk.exists("/node", true) != null) {
        zk.setData("/node", "changed".getBytes(), -1);
        // 查看/node节点数据
        System.out.println("修改节点数据:get /node => "
          + new String(zk.getData("/node", false, null)));
      }
      System.out.println("*******************************************************");
      if (zk.exists("/node", true) != null) {
        zk.setData("/node", "changed".getBytes(), -1);
        // 查看/node节点数据
        System.out.println("修改节点数据:get /node => "
          + new String(zk.getData("/node", false, null)));
      }
      System.out.println("*******************************************************");
      // 删除节点
/*    if (zk.exists("/node/sub1", true) != null) {
      zk.delete("/node/sub1", -1);
      zk.delete("/node", -1);
      // 查看根节点
      System.out.println("删除节点:ls / => " + zk.getChildren("/", true));
    }*/
    }catch (Exception e) {
      System.out.println("运行出错:"+e.getMessage());
      System.out.println("运行出错:"+e);
    } finally {
      // 关闭连接
      if (zk!=null) {
        zk.close();
      }
    }
  }
}

zk watch

package zookeeper.watch.demo;

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;
import org.apache.zookeeper.ZooKeeper;

import java.io.IOException;
import java.util.List;

public class watch {

  public static void main(String[] args)
    throws IOException, KeeperException, InterruptedException {
    ZooKeeper zk = null;
    try{
      /**
       *  创建一个与服务器的连接
       *  参数一:服务器地址和端口号(该端口号值服务器允许客户端连接的端口号)
       *  参数二:连接会话超时时间
       *  参数三:观察者,连接成功会触发该观察者。不过只会触发一次。
       *      该Watcher会获取各种事件的通知
       */
      zk = new ZooKeeper("kafka3:2181", 60000, new Watcher() {
        // 监控所有被触发的事件
        @Override
        public void process(WatchedEvent event) {
          System.out.println("监控所有被触发的事件:EVENT:" + event.getType());
        }
      });
      System.out.println("*******************************************************");
      // 查看根节点的子节点
      System.out.println("查看根节点的子节点:ls / => " + zk.getChildren("/", true));
      System.out.println("*******************************************************");
      // 创建一个目录节点
      if (zk.exists("/node", true) == null) {
        /**
         * 参数一:路径地址
         * 参数二:想要保存的数据,需要转换成字节数组
         * 参数三:ACL访问控制列表(Access control list),
         *      参数类型为ArrayList<ACL>,Ids接口提供了一些默认的值可以调用。
         *      OPEN_ACL_UNSAFE     This is a completely open ACL
         *                          这是一个完全开放的ACL,不安全
         *      CREATOR_ALL_ACL     This ACL gives the
         *                           creators authentication id's all permissions.
         *                          这个ACL赋予那些授权了的用户具备权限
         *      READ_ACL_UNSAFE     This ACL gives the world the ability to read.
         *                          这个ACL赋予用户读的权限,也就是获取数据之类的权限。
         * 参数四:创建的节点类型。枚举值CreateMode
         *      PERSISTENT (0, false, false)
         *      PERSISTENT_SEQUENTIAL (2, false, true)
         *          这两个类型创建的都是持久型类型节点,回话结束之后不会自动删除。
         *          区别在于,第二个类型所创建的节点名后会有一个单调递增的数值
         *      EPHEMERAL (1, true, false)
         *      EPHEMERAL_SEQUENTIAL (3, true, true)
         *          这两个类型所创建的是临时型类型节点,在回话结束之后,自动删除。
         *          区别在于,第二个类型所创建的临时型节点名后面会有一个单调递增的数值。
         * 最后create()方法的返回值是创建的节点的实际路径
         */
        zk.create("/node", "conan".getBytes(),
          ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
        System.out.println("创建一个目录节点:create /node conan");
        /**
         *  查看/node节点数据,这里应该输出"conan"
         *  参数一:获取节点的路径
         *  参数二:说明是否需要观察该节点,设置为true,则设定共享默认的观察器
         *  参数三:stat类,保存节点的信息。例如数据版本信息,创建时间,修改时间等信息
         */
        System.out.println("查看/node节点数据:get /node => "
          + new String(zk.getData("/node", false, null)));
        /**
         * 查看根节点
         * 在此查看根节点的值,这里应该输出上面所创建的/node节点
         */
        System.out.println("查看根节点:ls / => " + zk.getChildren("/", true));
      }
      System.out.println("*******************************************************");

      zk.getChildren("/node",new MyWatch(zk,"/node"));


      // 创建一个子目录节点
      if (zk.exists("/node/sub9", true) == null) {
        zk.create("/node/sub9", "sub1".getBytes(),
          ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
        System.out.println("创建一个子目录节点:create /node/sub7 sub1");
        // 查看node节点
  /*      System.out.println("查看node节点:ls /node => "
          + zk.getChildren("/node", false));*/
      }
      System.out.println("*******************************************************");


      if (zk.exists("/node/sub10", true) == null) {
        zk.create("/node/sub10", "sub1".getBytes(),
          ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
        System.out.println("创建一个子目录节点:create /node/sub8 sub1");
        // 查看node节点
/*        System.out.println("查看node节点:ls /node => "
          + zk.getChildren("/node", false));*/
      }
      System.out.println("*******************************************************");


      // 创建一个子目录节点
/*      if (zk.exists("/node/sub2/sub2-1", true) == null) {
        zk.create("/node/sub2/sub2-1", "sub2".getBytes(),
          ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
        System.out.println("创建一个子目录节点:create /node/sub1-1/sub2-1 sub2");
        // 查看node节点
        System.out.println("查看node节点:ls /node => "
          + zk.getChildren("/node", true));
      }
      System.out.println("*******************************************************");*/

      // 删除节点
/*    if (zk.exists("/node/sub1", true) != null) {
      zk.delete("/node/sub1", -1);
      zk.delete("/node", -1);
      // 查看根节点
      System.out.println("删除节点:ls / => " + zk.getChildren("/", true));
    }*/
    }catch (Exception e) {
      System.out.println("运行出错:"+e.getMessage());
      System.out.println("运行出错:"+e);
    } finally {
      // 关闭连接
      if (zk!=null) {
        zk.close();
      }
    }
  }

  public static class MyWatch  implements Watcher {
    ZooKeeper zk ;
    String path;
    public MyWatch(ZooKeeper zk,String path){
      this.zk = zk;
      this.path =path;
    }
    @Override
    public void process(WatchedEvent event) {
      System.out.println("=======================================");
      System.out.println("getData watch: "+event.toString());

      try {
        //true   default Watch  被重新注册   new zk的那个watch

        Event.EventType type = event.getType();

        switch(type) {
          case NodeChildrenChanged:

            //删除topic操作
            //增加topic操作

            List<String> list = zk.getChildren(path,this);
        default:
            break;

        }

      } catch (KeeperException e) {
        e.printStackTrace();
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
    }
  }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值