ZooKeeper之Java客户端API使用—创建节点。

2023-11-16

        客户端可以通过ZooKeeper的API来创建一个数据节点,有如下两个接口:

  • String create(final String path, byte data[], List<ACL> acl, CreateMode createMode)
  • void create(final String path, byte data[], List<ACL> acl, CreateMode createMode, StringCallback cb, Object ctx)

        这两个接口分别以同步和异步方式创建节点,API方法的参数说明如下表所示。

参数名 说明
path 需要创建的数据节点的节点路径,例如,/zk-book/foo
data[] 一个字节数组,是节点创建后的初始内容
acl 节点的ACL策略
createMode 节点类型,是一个枚举类型,通常有4种可选的节点类型
  • 持久(PERSISTENT)
  • 持久顺序(PERSISTENT_SEQUENTIAL)
  • 临时(EPHEMERAL)
  • 临时顺序(EPHEMERAL_SEQUENTIAL)
cb 注册一个异步回调函数。开发人员需要实现StringCallback接口,主要是对下面这个方法的重写:
void processResult(int rc, String path, Object ctx, String name);
当服务端节点创建完毕后,ZooKeeper客户端就会自动调用这个方法,这样就可以处理相关的业务逻辑了
ctx 用于传递一个对象,可以在回调方法执行的时候使用,通常是放一个上下文(Context)信息

        需要注意几点,无论是同步还是异步接口,ZooKeeper都不支持递归创建,即无法在父节点不存在的情况下创建一个子节点。另外,如果一个节点已经存在了,那么创建同名节点的时候,会抛出NodeExistsException异常。

        目前,ZooKeeper的节点内容只支持字节数组(byte[])类型,也就是说,ZooKeeper不负责为节点内容进行序列化,开发人员需要自己使用序列化工具将节点内容进行序列化和反序列化。对于字符串,可以简单地使用“string”.getBytes()生成一个字节数组;对于其他复杂对象,可以使用Hessian或是Kryo等专门的序列化工具来进行序列化。

        关于权限控制,如果你的应用场景没有太高的权限要求,那么可以不关注这个参数,只需要在acl参数中传入参数Ids.OPEN_ACL_UNSAFE,这就表明之后对这个节点的任何操作都不受权限控制。

使用同步API创建一个节点

// ZooKeeper API创建节点,使用同步(sync)接口

public class ZooKeeper_Create_API_Sync_Usage implements Watcher {

private static CountDownLatch connectedSemaphore = new CountDownLatch(1);

public static void main(String[] args) throws Exception {

ZooKeeper zookeeper = new ZooKeeper("domain1.book.zookeeper:2181" , 5000 ,new ZooKeeper_Create_API_Sync_Usage());

connectedSemaphore.await();

String path1 = zookeeper.create("/zk-test-ephemeral-", "".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);

System.out.println("Success create znode: " + path1);

String path2 = zookeeper.create("/zk-test-ephemeral-", "".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);

System.out.println("Success create znode: " + path2);

}

public void process(WatchedEvent event) {

if (KeeperState.SyncConnected == event.getState()) {

connectedSemaphore.countDown();

}

}

}

        运行程序,输出结果如下:

        在上面这个程序片段中,使用了同步的节点创建接口:String create(final String path, byte data[], List<ACL> acl, CreateMode createMode)。在接口使用中,我们分别创建了两种类型的节点:临时节点和临时顺序节点。从返回的结果可以看出,如果创建了临时节点,那么API的返回值就是当时传入的path参数;如果创建了临时顺序节点,那么ZooKeeper会自动在节点后缀加上一个数字,并且在API接口的返回值中返回该数据节点的一个完整的节点路径。

使用异步API创建一个节点

// ZooKeeper API 创建节点,使用异步(async)接口

public class ZooKeeper_Create_API_Sync_Usage implements Watcher {

private static CountDownLatch connectedSemaphore = new CountDownLatch(1);

public static void main(String[] args) throws Exception {

ZooKeeper zookeeper = new ZooKeeper("domain1.book.zookeeper:2181" , 5000 ,new ZooKeeper_Create_API_ASync_Usage());

connectedSemaphore.await();

zookeeper.create("/zk-test-ephemeral-", "".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL, new IStringCallback(), "I am context.");

zookeeper.create("/zk-test-ephemeral-", "".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL, new IStringCallback(), "I am context.");

zookeeper.create("/zk-test-ephemeral-", "".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL, new IStringCallback(), "I am context.");

Thread.sleep(Integer.MAX_VALUE);

}

public void process(WatchedEvent event) {

if (KeeperState.SyncConnected == event.getState()) {

connectedSemaphore.countDown();

}

}

}

class IStringCallback implements AsyncCallback.StringCallback {

public void processResult(int rc, String path, Object ctx, String name) {

System.out.println("Create path result: [" + rc + ", " + path + ", " + ctx + ", real path name: " + name);

}

}

        运行程序,输出结果如下:

        从这个程序片段中可以看出,使用异步方式创建接口也很简单。用户仅仅需要实现AsyncCallback.StringCallback()接口即可。AsyncCallback包含了StatCallback、DataCallback、ACLCallback、ChildrenCallback、Children2Callback、StringCallback和VoidCallback七种不同的回调接口,用户可以在不同的异步接口中实现不同的接口。

        和同步接口方法最大的区别在于,节点的创建过程(包括网络通信和服务端的节点创建过程)是异步的。并且,在同步接口调用过程中,我们需要关注接口抛出异常的可能;但是在异步接口中,接口本身是不会抛出异常的,所有的异常都会在回调函数中通过Result Code(响应码)来体现。

        下面来重点看下回调方法:void processResult(int rc, String path, Object ctx, String name)。这个方法的几个参数主要如下表所示。

参数名 说明
rc Result Code,服务端响应码。客户端可以从这个响应码中识别出API调用的结果,常见的响应码如下。
  • 0(Ok):接口调用成功。
  • -4(ConnectionLoss):客户端和服务端连接已断开。
  • -110(NodeExists):指定节点已存在。
  • -112(SessionExpired):会话已过期。
path 接口调用时传入API的数据节点的节点路径参数值。
ctx 接口调用时传入API的ctx参数值。
name 实际在服务端创建的节点名。在上面代码中,第三次创建节点时,由于创建的节点类型是顺序节点,因此在服务端没有真正创建好顺序节点之前,客户端无法知道节点的完整节点路径。于是,在回调方法中,服务端会返回这个数据节点的完整节点路径。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ZooKeeper之Java客户端API使用—创建节点。 的相关文章

随机推荐

  • DataOutputStream 类与BufferedOutputStream类的区别是什么

    DataOutputStream 类与Buffere dOutputStream类的区别是什么 DataOutputStream dataout new DataOutputStream new FileOutputStream file
  • Google Earth Engine(GEE) 01-中输入提示快捷键Ctrl+space无法使用的问题

    Google Earth Engine GEE 01 中输入提示快捷键Ctrl space无法使用的问题 GEE中 Ctrl space组合键用于代码输入快捷提示 能够提高编码的准确度和速度 但是 windows系统默认Ctrl space
  • Windows下Jenkins的运行环境由Java8 升级为Java11

    开源 Devops 工具 Jenkins 在官方博客宣布 从 6 月 28 日发布的 Jenkins 2 357 和将于 9 月发布的 LTS 版本开始 Jenkins 需要 Java 11 才能使用 将放弃 Java 8 步骤 1 安装j
  • STM32CUBEMX配置教程(一)基础配置

    STM32CUBEMX配置教程 一 基础配置 基于STM32H743VI 使用STM32CUBEMX两年了 始终觉得这个工具非常的方便 但因为不是经常使用 导致有些要点总是会有些遗忘 因此写下这一系列教程以供记忆 顺便让我这个大萌新给广大小
  • c++智能指针之auto_ptr详解(有源码有实例)

    前言 内存泄漏大概是每一个c c 程序员最深恶痛绝的问题 因为大部分此类问题都是令广大c程序员很抓狂 掉头发的疑难杂症 而内存泄漏的根本原因就是指针的使用不当引起的 例如指针指向的内存没有释放 导致产生了程序无法控制的内存块 而随着程序不断
  • Pycharm连接MySQL

    使用MySQL内置工具 命令 创建数据库 unicom 数据表 admin 表名 admin 列 id 整型 自增 主键 username 字符串 不为空 password 字符串 不为空 mobile 字符串 不为空 Python代码实现
  • VC++实现视频压缩编码标准 MPEG-4

    转载请标明是引用于 http blog csdn net chenyujing1234 欢迎大家提出意见 一起讨论 需要源码的请与我联系 参考书籍 lt
  • 测试人如何编写测试用例?一文从3个方面带你写一个合格的测试用例

    前言 作为一个测试新人 刚开始接触测试 对于怎么写测试用例很头疼 无法接触需求 只能根据站在用户的角度去做测试 但是这样情况会导致不能全方位的测试APP 这种情况就需要一份测试用例了 但是不会写 求指教 还有就是测试出来的bug该如何追踪
  • 访问数据库

    一 JDBC简介 JDBC时Java DataBase Connectivity的缩写 它是连接Java程序和数据库服务器的纽带 JDBC的实现封装了与各种数据库服务器通信的细节 Java程序通过JDBC API来访问数据库 有以下优点 1
  • 【leetcode刷题】最长回文子串

    题目描述 给你一个字符串 s 找到 s 中最长的回文子串 示例1 输入 s babad 输出 bab 解释 aba 同样是符合题意的答案 示例2 输入 s cbbd 输出 bb 方法一 暴力枚举 param string s return
  • 单片机概述习题以及答案

    一 填空 除了单片机这一名称之外 单片机还可称为 或 答 微控制器 嵌入式控制器 2 单片机与普通微型计算机的不同之处在于其将 和 三部分 通过内部 连接在一起 集成于一块芯片上 答 CPU 存储器 I O 口 总线 AT89S52 单片机
  • 线性代数期末抱佛脚

    1 Row operations steps for finding solution if possible in linear systems many linear equations 求解的方法有两种 第一种 如 若要求该矩阵的解
  • LSTM对比Bi-LSTM的电力负荷时间序列预测(Matlab)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 0 概述 1 电力负荷预测 2 滑动窗输入结构的构建 3 LSTM 4 Bi LSTM 5 运行结果 6 Matla
  • jQuery MiniUI 开发教程 树形控件 树形:懒加载树(五)

    b 懒加载树 b img http www miniui com docs api images lazytree gif img 参考示例 url http www miniui com demo tree lazytree html 懒
  • C++:读写INI文件

    C 读写INI文件 INI文件是一种常见的配置文件格式 用于存储应用程序的配置信息 在C 中 我们可以使用一些库来读取和写入INI文件 在本文中 我将向您展示如何使用C 读取和写入INI文件 读取INI文件 对于INI文件的读取 我们可以使
  • Spring Data JPA 多数据源的使用

    p 项目中使用多个数据源在以往工作中比较常见 微服务架构中不建议一个项目使用多个数据源 在微服务架构下 一个微服务拥有自己独立的一个数据库 如果此微服务要使用其他数据库的数据 需要调用对应库的微服务接口来调用 而不是在一个项目中连接使用多个
  • U盘安装redhat 7.4的最终解决方案

    U盘安装redhat 7 4的最终解决方案 终于将redhat 7 4装上x3650 M5服务器了 过程无比艰辛 因为与CentOS7有一定区别 与redhat6 8完全不同 遇到的问题有 A 刻录镜像的时候只能刻录一个4MB EFI文件夹
  • 详解TCP为什么不能是两次握手

    三次握手的过程 注意不要遗漏全双工下两缓存 读 写缓存 的分配和变量的分配 CLOSED 表示初始状态 LISTEN 该状态表示服务器端的某个SOCKET处于监听状态 可以接受连接 SYN SENT 这个状态与SYN RCVD遥相呼应 当客
  • 【golang】for range中取地址操作的陷阱

    Tips for range创建了每个元素的副本 而不是直接返回每个元素的引用 例子1 package main import fmt func main slice int 0 1 2 3 myMap make map int int f
  • ZooKeeper之Java客户端API使用—创建节点。

    客户端可以通过ZooKeeper的API来创建一个数据节点 有如下两个接口 String create final String path byte data List