• 第2关:节点删除与创建


    为了完成本关任务,你需要掌握: 1.同步调用和异步调用区别; 2.节点创建 API 使用; 3.节点删除 API 使用。

    同步调用和异步调用

    ZooKeeper 提供的 API 操作有异步调用和同步调用两种,区别在于:

    • 同步调用需要处理异常;

    • 异步调用已经把异常封装为返回码。一般来说异步调用会在命令发送到 Zookeeper 服务器之前,就返回继续执行之后的代码。

    推荐使用异步调用方法,不但可以获得更好的性能,更可以统一编码风格,免去对异常的处理。同时,即使方法调用失败,回调函数仍然会继续调用失败的方法,直到返回正确的返回码。

    节点创建 API 的使用

    节点创建 API 分为同步和异步创建两种方式:

    一、 同步调用节点创建方法:

     
    
    public String create(final String path, byte data[], List<ACL> acl, CreateMode createMode) throws KeeperException, InterruptedException

    上述方法的参数含义如下所示:

    1、path:创建节点的路径;

    2、data[]:创建节点的数据值,参数类型是字节数组;

    3、acl:节点的访问权限。主要有以下几种类型:

    • ANYONE_ID_UNSAFE:任何人;
    • AUTH_IDS:只用来授权;
    • OPEN_ACL_UNSAFE:开放的 ACL;
    • CREATOR_ALL_ACL:创建 ACL;
    • READ_ACL_UNSAFE: 所有人可读。

    4、createMode:节点类型。主要有以下几种类型:

    • PERSISTENT:持久;
    • PERSISTENT_SEQUENTIAL:持久顺序;
    • EPHEMERAL:临时;
    • EPHEMERAL_SEQUENTIAL:临时顺序。


    同步创建临时节点示例:

    String ephemeralPath = zooKeeper.create("/zk-test-create-ephemeral", "ephemeral".getBytes(), ZooDefs.Ids.ANYONE_ID_UNSAFE, CreateMode.EPHEMERAL);

    上述语句可用于创建一个临时节点 /zk-test-create-ephemeral,节点数据为"ephemeral",该节点的访问权限为任何人。


    二、异步调用节点创建方法:

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

    同步创建方法的参数异步方法都有,除此之外,它还有以下两个特有的:

    • cb:回调函数对象,该对象需实现回调函数接口,并重写 processResult() 方法。数据节点创建完成之后,会调用此方法进行业务逻辑处理;
    • ctx:创建节点的名称。

    异步创建临时顺序节点:

    zooKeeper.create("/zk-test-create-async-sequential","async-sequential".getBytes(), ZooDefs.Ids.ANYONE_ID_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL,new MyStringCallBack(),"CreateNode");

    上述语句可用于创建一个临时顺序节点 /zk-test-create-async-sequential,节点数据为"async-sequential",节点的访问权限为任何人,节点上下文信息为“CreateNode”,节点的回调函数为我们自己创建的 MyStringCallBack 对象。

    同步和异步节点创建示例:

    1. import org.apache.zookeeper.*;
    2. import java.io.IOException;
    3. public class MyTest {
    4. private ZooKeeper zk;
    5. // 实现一个 Watcher
    6. private Watcher wh = new Watcher() {
    7. // 重写 process 方法
    8. public void process(WatchedEvent event) {
    9. System.out.println(event);
    10. }
    11. };
    12. // 连接 ZooKeeper 服务器
    13. public void createZKInstance() throws IOException {
    14. zk = new ZooKeeper("localhost:2181", 15000, this.wh);
    15. }
    16. // 同步创建节点
    17. public String createNode() throws IOException, KeeperException, InterruptedException {
    18. String ephemeralPath = zk.create("/zk-test-create-ephemeral", "ephemeral".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
    19. return ephemeralPath;
    20. }
    21. // 异步创建节点
    22. public void createNodeSync() throws KeeperException, InterruptedException{
    23. zk.create("/zk-test-create-async-sequential","async-sequential".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL,new MyStringCallBack(),"CreateNode");
    24. }
    25. public static void main(String[] args) throws IOException, KeeperException, InterruptedException {
    26. MyTest myTest = new MyTest();
    27. // 连接 ZooKeeper 服务器
    28. myTest.createZKInstance();
    29. // 同步创建节点
    30. String node = myTest.createNode();
    31. // 输出节点
    32. System.out.println(node);
    33. // 异步创建节点
    34. myTest.createNodeSync();
    35. }
    36. // 回调函数
    37. public static class MyStringCallBack implements AsyncCallback.StringCallback{
    38. @Override
    39. public void processResult(int i, String s, Object o, String s1) {
    40. System.out.println(s);
    41. }
    42. }
    43. }

    执行结果:

    1. WatchedEvent state:SyncConnected type:None path:null
    2. /zk-test-create-ephemeral
    3. /zk-test-create-async-sequential

    上述代码中,我们使用同步方法创建了节点 /zk-test-create-ephemeral,使用异步方法创建了节点 /zk-test-create-async-sequential。

    节点删除API使用

    同样的,节点删除也有异步和同步两种方法,分别使用以下 API :

    同步删除:

    zk.delete(String path, int version);

    异步删除:

    zk.delete(String path, int version, StringCallback cb, Object ctx);

    其中,version 表示不同的版本,可以通过 Stat 对象的 getVersion() 方法获取。如果该值为 -1,则忽略版本,将节点删除。

    删除之前创建的节点示例:

    1. import org.apache.zookeeper.*;
    2. import java.io.IOException;
    3. public class MyTest {
    4. private ZooKeeper zk;
    5. // 实现一个 Watcher
    6. private Watcher wh = new Watcher() {
    7. // 重写 process 方法
    8. public void process(WatchedEvent event) {
    9. System.out.println(event);
    10. }
    11. };
    12. // 连接 ZooKeeper 服务器
    13. public void createZKInstance() throws IOException {
    14. zk = new ZooKeeper("localhost:2181", 15000, this.wh);
    15. }
    16. // 同步创建节点
    17. public String createNode() throws IOException, KeeperException, InterruptedException {
    18. String ephemeralPath = zk.create("/zk-test-create-ephemeral", "ephemeral".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
    19. return ephemeralPath;
    20. }
    21. // 同步删除节点
    22. public void deleteNode() throws IOException {
    23. zk.delete("/zk-test-create-ephemeral", -1);;
    24. }
    25. public static void main(String[] args) throws IOException, KeeperException, InterruptedException {
    26. MyTest myTest = new MyTest();
    27. // 连接 ZooKeeper 服务器
    28. myTest.createZKInstance();
    29. // 同步创建节点
    30. String node = myTest.createNode();
    31. // 输出节点
    32. System.out.println(node);
    33. // 同步删除节点
    34. myTest.deleteNode();
    35. }
    36. }

    执行结果:

    1. WatchedEvent state:SyncConnected type:None path:null
    2. /zk-test-create-ephemeral
    3. WatchedEvent state:SyncConnected type:NodeDeleted path:/zk-test-create-ephemeral

    上述代码中,我们使用 delete 方法删除了节点 /zk-test-create-ephemeral。返回的结果也显示“NodeDeleted”(节点被删除)。

    编程要求

    仔细阅读右侧编辑区内给出的代码框架及注释,在 Begin-End 间编写程序代码,实现以下需求:

    • 在 createNodeSync 方法中使用异步创建节点的方法创建所有人可读的持久节点 /mynode1,节点数据为 This node is mine!,节点名称为 CreateMynode!,回调函数请使用“new test.MyStringCallback()” 对象;
    • 在 deleteNode 方法中删除节点 /mynode1。

    1. import org.apache.zookeeper.*;
    2. import java.io.IOException;
    3. public class Student {
    4. // 初始化 ZooKeeper 实例
    5. private ZooKeeper zk;
    6. // 实现一个 Watcher
    7. private Watcher wh = new Watcher() {
    8. // 重写 process 方法
    9. public void process(WatchedEvent event) {
    10. System.out.println(event);
    11. }
    12. };
    13. // 连接ZooKeeper服务器
    14. public ZooKeeper createZKInstance() throws IOException {
    15. zk = new ZooKeeper("localhost:2181", 15000, this.wh);
    16. return zk;
    17. }
    18. // 使用同步方式删除节点 /mynode1
    19. public void deleteNode() throws KeeperException, InterruptedException {
    20. // 请在此处编写代码
    21. /********* Begin *********/
    22. zk.delete("/mynode1", -1);;
    23. /********* End *********/
    24. }
    25. // 使用异步方式创建节点 /mynode1
    26. public void createNodeSync() {
    27. // 请在此处编写代码
    28. /********* Begin *********/
    29. zk.create("/mynode1","This node is mine!".getBytes(), ZooDefs.Ids.READ_ACL_UNSAFE, CreateMode.PERSISTENT,new test.MyStringCallback(),"CreateMynode!");
    30. /********* End *********/
    31. }
    32. }

  • 相关阅读:
    linux下python导入特定路径的包
    Redisson之lock()和tryLock()的区别
    ASP.NET Core 6框架揭秘实例演示[23]:ASP.NET Core应用承载方式的变迁
    企业电子招标采购系统源码Spring Boot + Mybatis + Redis + Layui + 前后端分离 构建企业电子招采平台之立项流程图
    前端工程化知识系列(6)
    Mac下载安装配置运行MySQL
    Error: Member not found: ‘FirebaseAppPlatform.verifyExtends‘
    Linux (Ubuntu)文件系统结构(入门必看)
    网络空间安全未来就业前景和就业方向,看着六点
    Dubbo底层网络连接模型
  • 原文地址:https://blog.csdn.net/qq_61604164/article/details/128083500