linuxsir首页 LinuxSir.Org | Linux、BSD、Solaris、Unix | 开源传万世,因有我参与欢迎您!
网站首页 | 设为首页 | 加入收藏
您所在的位置:主页 > Linux基础建设 >

ZooKeeper异步调用命令

时间:2019-09-03  来源:未知  作者:admin666

在ZooKeeper中,所有的同步调用命令,都会有一个相应的异步调用方法。异步调用能在一个单独线程中同时提交更多的命令,也能在一定程度上简化代码实现。

1 异步create方法

如创建zNode的命令create,同步方法的定义是

/**
 * @param path 创建节点的路径
 * @param data 创建节点的初始值
 * @param acl 创建节点的ACL
 * @param createMode 创建节点使用永久还是临时模式
 * @return 创建节点的真实路径
 * @throws KeeperException 服务器返回了非0的错误代码
 * @throws KeeperException.InvalidACLException ACL非法或者为空
 * @throws InterruptedException 事务被中断
 * @throws IllegalArgumentException 路径非法
 */
public String create(final String path,
    byte data[],
    List<ACL> acl,
    CreateMode createMode);

对应的异步调用方法

/**
 * create方法的异步调用方法
 * @param path 创建节点的路径
 * @param data 创建节点的初始值
 * @param acl 创建节点的ACL
 * @param createMode 创建节点使用永久还是临时模式
 * @param cb 包括回调函数的对象
 * @param ctx 上下文对象(异步回调时会传递给callback,方便出错时重新调用)
 */
public void create(final String path,
    byte data[],
    List<ACL> acl,
    CreateMode createMode,
    StringCallback cb,
    Object ctx);

StringCallback的定义

interface StringCallback extends AsyncCallback {
    /**
     * 处理异步调用的结果
     * @param rc   调用的返回码
     * @param path 异步调用时的路径参数
     * @param ctx  异步调用时的上下文对象
     * @param name 实际创建的节点名
     *             成功时通常同path相同,除非创建的是sequential节点
     */
    public void processResult(int rc,
        String path,
        Object ctx,
        String name);
}

异步调用与同步调用的两个主要区别:

  1. 异步调用没有返回值(void)
  2. 异步调用不抛出异常,异常情况都通过rc参数传递

2 部分rc代码定义

回调函数的第一个参数 rc ,是调用的返回值。ZooKeeper在枚举org.apache.zookeeper.KeeperException.Code中做了定义。从源码中摘出一些我们可能会经常使用的Code

/** 一切安好 */
OK (Ok),

/** 服务器连接丢失 */
CONNECTIONLOSS (ConnectionLoss),
/** 操作超时 */
OPERATIONTIMEOUT (OperationTimeout),
/** 参数错误 */
BADARGUMENTS (BadArguments),
 
/** 节点不存在 */
NONODE (NoNode),
/** 临时节点没有子节点 */
NOCHILDRENFOREPHEMERALS (NoChildrenForEphemerals),
/** 节点已经存在 */
NODEEXISTS (NodeExists),
/** 节点有子节点 */
NOTEMPTY (NotEmpty),
/** 会话超时 */
SESSIONEXPIRED (SessionExpired),
/** 请求超时*/
REQUESTTIMEOUT (-122),

3 回调函数的一般用法

下面是一个创建节点的简单例子。注意,ctx参数传递的是data,这个参数会直接传递到callback函数中,这样就可以直接重新调用create命令。

void createNode(String path, byte[] data) {
  zooKeeper.create(nodePath, data,
    ZooDefs.Ids.OPEN_ACL_UNSAFE,
    CreateMode.EPHEMERAL,
    nodeCreateCallback,
    data);
}
 
AsyncCallback.StringCallback nodeCreateCallback = new AsyncCallback.StringCallback() {
  public void processResult(int rc, String path, Object ctx, String name) {
    switch (KeeperException.Code.get(rc)) {
      case OK:
        // 创建节点成功
        break;
      case CONNECTIONLOSS:
        // 连接丢失,重新发布命令
        createNode(path, ctx);
        return;
      default:
        // 其他异常,抛出或记录异常
        KeeperException e = KeeperException.create(KeeperException.Code.get(rc), path);
        log.error("create node error", e);
    }
  }
};
复制代码

4 异步回调接口定义

ZooKeeper在org.apache.zookeeper.AsyncCallback中定义了几个回调接口

回调接口

说明

适用的异步命令

StatCallback

用于获取节点的状态

void exists()

void setData()

DataCallback

用于获取节点的值和状态

void getData()

void getConfig()

ACLCallback

用于获取节点的ACL信息和状态

void getACL()

ChildrenCallback

用于获取节点的子节点列表

void getChildren()

Children2Callback

用于获取节点的子节点列表和状态

void getChildren()

Create2Callback

用于获取节点的名称和状态

void create()

StringCallback

用于获取节点的名称

void create()

VoidCallback

不返回任何信息

void delete()

void sync()

void removeWatches()

void removeAllWatches()

MultiCallback

用于多命令请求的返回值

void multi()

可以看到,有些异步命令,可以选择使用多个不同的Callback,见下表

异步命令

可选的回调接口

接口说明

void create()

Create2Callback

用于获取节点的名称和状态

StringCallback

用于获取节点的名称

void getChildren()

ChildrenCallback

用于获取节点的子节点列表

Children2Callback

用于获取节点的子节点列表和状态

linux
上一篇:没有了
友情链接
  • Mozilla发布Firefox 67.0.4,修复沙箱逃逸漏洞
  • 蚂蚁金服正式成为CNCF云原生计算基金会黄金会员
  • Firefox 68将采用Microsoft BITS安装更新
  • OpenSSH增加对存储在RAM中的私钥的保护
  • 谷歌想实现自己的curl,为什么?
  • Raspberry Pi 4发布:更快的CPU、更大的内存
  • Firefox的UA将移除CPU架构信息
  • Ubuntu放弃支持32位应用程序实属乌龙,Steam会否重回Ubuntu怀抱
  • Qt 5.13稳定版发布:引入glTF 2.0、改进Wayland以及支持Lottie动
  • 红帽企业Linux 7现已内置Redis 5最新版
  • Slack进入微软内部禁用服务清单,GitHub也在其列?
  • 安全的全新编程语言V发布首个可用版本
  • Windows Terminal已上架,快尝鲜
  • 阿里巴巴微服务开源生态报告No.1
  • 面世两年,Google地球将支持所有基于Chromium的浏览器
  • 推进企业容器化持续创新,Rancher ECIC千人盛典完美收官
  • CentOS 8.0最新构建状态公布,或于数周后发布
  • Debian移植RISC
  • 微软拆分操作系统的计划初现雏形
  • Oracle发布基于VS Code的开发者工具,轻松使用Oracle数据库
  • Ubuntu 19.10停止支持32位的x86架构
  • 微软为Windows Terminal推出全新logo
  • 联想ThinkPad P系列笔记本预装Ubuntu系统
  • 微软发布适用于Win7/8的Microsoft Edge预览版
  • 启智平台发布联邦学习开源数据协作项目OpenI纵横
  • 经过六个多月的延迟,微软终于推出Hyper
  • ZFS On Linux 0.8.1 发布,Python可移植性工作
  • DragonFly BSD 5.6.0 发布,HAMMER2状态良好
  • Linux Kernel 5.2
  • CentOS 8.0 看起来还需要几周的时间
  • 百度网盘Linux版正式发布
  • PCIe 6.0宣布:带宽翻倍 狂飙至256GB/s
  • PHP 7.4 Alpha 发布,FFI扩展,预加载Opcache以获得更好的性能
  • Canonical将在未来的Ubuntu版本中放弃对32位架构的支持
  • Scala 2.13 发布,改进的编译器性能
  • 微软的GitHub收购了Pull Panda,并且使所有订阅完全免费
  • Windows Subsystem for Linux 2 (WSL 2)现在适用于Windows 10用
  • Debian 10 “Buster”的RISC
  • MariaDB宣布发布MariaDB Enterprise Server 10.4
  • DXVK 1.2.2 发布,带来微小的CPU开销优化
  • DragonFlyBSD 5.6 RC1 发布,VM优化,默认为HAMMER2
  • PrimeNG 8.0.0 发布,支持Angular 8,FocusTrap等
  • GIMP 2.10.12 发布,一些有用的改进
  • 清华大学Anaconda 镜像服务即将恢复
  • Debian GNU/Linux 10 “Buster” 操作系统将于2019年7月6日发布
  • 时时彩论坛
  • 五星体育斯诺克
  • 北单比分直播
  • 河北11选5走势图
  • 福建体彩36选7开奖结果
  • 九龙图库下载