5.Java访问和使用Zookeeper

五.Java访问Zookeeper

Java操作的是Zookeeper客户端

因此,使用Java访问Zookeeper的时候

其服务器必须处于启动状态

1.POM依赖

<dependency>
    <groupId>org.apache.zookeeper</groupId>
    <artifactId>zookeeper</artifactId>
    <version>3.4.14</version>
</dependency>

2.常用API

  • 连接服务器

    • new ZooKeeper(String connectString, int sessionTimeout, Watcher watcher)
    • 创建Zookeeper客户端对象
    • connectString:需要连接的Zookeeper服务器的ip与端口
    • sessionTimeout:超时时间,单位毫秒
    • watcher:监控
      • Zookeeper依赖提供了对应Watcher,其实一个接口
      • 传递其对应的实现类即可
    ZooKeeper zk = new ZooKeeper("127.0.0.1:2181",3000,new MyWatcher());
    
  • 获取指定节点下的子节点信息

    • 相当于ls path命令
    • getChildren(String path, boolean watch)
    • path:指定的节点路径
    • watch:是否监听
    List<String> children = zkCli.getChildren("/", false);
    System.out.println(children);
    
  • 创建节点

    • 相当于create [-s] [-e] path 节点内容命令
    • create(final String path, byte data[], List<ACL> acl,CreateMode createMode)
    • path:节点路径
    • data:节点的数据
    • acl:权限的设置,可以通过ZooDefs常量接口选择需要的值
      • OPEN_ACL_UNSAFE表示权限完全开放
    • createMode:节点的类型
      • CreateMode是一个枚举类型
      • 提供了四种节点类型
      • PERSISTENT:持久化节点
      • PERSISTENT_SEQUENTIAL:持久化顺序编号节点
      • EPHEMERAL:临时节点
      • EPHEMERAL_SEQUENTIAL:临时顺序编号节点
    zkCli.create("/node1","Hello Zookeeper".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
    zkCli.create("/node","Hello Zookeeper".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT_SEQUENTIAL);
    zkCli.create("/temp1","Hello Zookeeper".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
    zkCli.create("/temp","Hello Zookeeper".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);
    
  • 获取指定节点下的数据

    • 相当于get path命令
    • byte[] getData(String path, boolean watch, Stat stat)
    • path:表示指定的节点路径
    • watch:是否监听
    • Stat:用于接收返回的详细信息
      • 如果只需要返回数据,则该值可以为null
    // 获取指定节点的数据
    byte[] data = zkCli.getData("/node1", false, null);
    System.out.println(new String(data));
    
    // 获取详细信息
    Stat stat = new Stat();
    byte[] data = zkCli.getData("/node1", false, stat);
    System.out.println("节点内容:"+new String(data));
    // 此时返回值仍然是节点内容
    // 返回的详细信息自动设置到参数Stat中
    // 可以从stat中获取对应的信息
    System.out.println(stat.getCzxid());
    System.out.println(stat.getDataLength());
    
  • 修改指定的节点

    • 相当于set path 节点内容命令
    • setData(final String path, byte data[], int version)
    • path:指定节点路径
    • data:节点内容
    • version:子节点变化版本号
      • 每次被修改,该版本均会发生变化
      • 对应的是详细信息对象Stat中的cversion
      • 可以通过Stat对象获取到对应的版本号
      • -1表示从未被修改
    // 修改节点信息
    // 该方式需要先查询对应的Stat才能使用
    zkCli.setData("/node1","Hello World".getBytes(),stat.getCversion());
    // 该方式可以直接使用
    zkCli.setData("/node1","Hello World".getBytes(),-1);
    
  • 删除指定的子节点

    • 相当于delete path命令
    • delete(final String path, int version)
    • path:指定节点路径
    • version:子节点变化版本号
    zkCli.delete("/node1",-1);
    
  • 判断指定节点是否存在

    • Stat exists(String path, boolean watch)
    • path:节点路径
    • watch:是否监听
    • 返回值为Stat
      • 如果该节点不存在则返回null
      • 如果该节点存在,则返回对应的详细信息
    // 判断指定节点是否存在
    Stat stat = zkCli.exists("/node1", false);
    System.out.println(stat);
    

1",“Hello World”.getBytes(),stat.getCversion());
// 该方式可以直接使用
zkCli.setData("/node1",“Hello World”.getBytes(),-1);


+ 删除指定的子节点

+ 相当于`delete path`命令
+ `delete(final String path, int version)`
+ path:指定节点路径
+ version:子节点变化版本号

```java
zkCli.delete("/node1",-1);
  • 判断指定节点是否存在

    • Stat exists(String path, boolean watch)
    • path:节点路径
    • watch:是否监听
    • 返回值为Stat
      • 如果该节点不存在则返回null
      • 如果该节点存在,则返回对应的详细信息
    // 判断指定节点是否存在
    Stat stat = zkCli.exists("/node1", false);
    System.out.println(stat);
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值