在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

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

ZooKeeper异步调用命令的更多相关文章

  1. Direct3D Draw函数 异步调用原理解析

    概述 在D3D10中,一个基本的渲染流程可分为以下步骤: 清理帧缓存: 执行若干次的绘制: 通过Device API创建所需Buffer: 通过Map/Unmap填充数据到Buffer中: 将Buff ...

  2. tornado 异步调用系统命令和非阻塞线程池

    项目中异步调用 ping 和 nmap 实现对目标 ip 和所在网关的探测 Subprocess.STREAM 不用担心进程返回数据过大造成的死锁, Subprocess.PIPE 会有这个问题. i ...

  3. Python开发程序:RPC异步执行命令(RabbitMQ双向通信)

    RPC异步执行命令 需求: 利用RibbitMQ进行数据交互 可以对多台服务器进行操作 执行命令后不等待命令的执行结果,而是直接让输入下一条命令,结果出来后自动打印 实现异步操作 不懂rpc的请移步h ...

  4. WCF初探-11:WCF客户端异步调用服务

    前言: 在上一篇WCF初探-10:WCF客户端调用服务 中,我详细介绍了WCF客户端调用服务的方法,但是,这些操作都是同步进行的.有时我们需要长时间处理应用程序并得到返回结果,但又不想影响程序后面代码 ...

  5. 异步调用webservice

    一.异步调用 asynchronous call(异步调用):一个可以无需等待被调用函数的返回值就让操作继续进行的方法 举例: 异步调用就是你 喊 你朋友吃饭 ,你朋友说知道了 ,待会忙完去找你 ,你 ...

  6. php异步调用方法实现示例

    php 异步调用方法   客户端与服务器端是通过HTTP协议进行连接通讯,客户端发起请求,服务器端接收到请求后执行处理,并返回处理结果.   有时服务器需要执行很耗时的操作,这个操作的结果并不需要返回 ...

  7. PHP中实现异步调用多线程程序代码

    本文章详细的介绍了关于PHP中实现异步调用多线程方法,下面我们以给1000个用户发送一封推荐邮件,用户输入或者导入邮件账号了提交服务器执行发送来讲述. 比如现在有一个场景,给1000个用户发送一封推荐 ...

  8. Axis2(8):异步调用WebService

    在前面几篇文章中都是使用同步方式来调用WebService.也就是说,如果被调用的WebService方法长时间不返回,客户端将一直被阻塞,直到该方法返回为止.使用同步方法来调用WebService虽 ...

  9. 【转】Zookeeper-Watcher机制与异步调用原理

    声明:本文转载自http://shift-alt-ctrl.iteye.com/blog/1847320,转载请务必声明. Watcher机制:目的是为ZK客户端操作提供一种类似于异步获得数据的操作. ...

随机推荐

  1. iOS 图解弹幕功能的实现

    先来看一张效果图(LICEcap录制的有点卡, 凑合看) 理一下大概流程: 接下来实现: 弹幕视图从底部弹上来, 依次动画向上滚动, 出屏幕就移除加入重用队列, 下次使用. 定义相关属性: 1. 根据 ...

  2. mysqli_query 的定义和用法

     定义和用法 mysqli_query() 函数执行某个针对数据库的查询. 语法 mysqli_query(connection,query,resultmode); 参数 描述 connecti ...

  3. 脱壳系列_2_IAT加密壳_详细版解法1(含脚本)

    1 查看壳程序信息 使用ExeInfoPe 分析: 发现这个壳的类型没有被识别出来,Vc 6.0倒是识别出来了,Vc 6.0的特征是 入口函数先调用GetVersion() 2 用OD找OEP 拖进O ...

  4. ORM详解

    讲解对象:ORM详解 作者:融水公子 rsgz 1 前言:开发流程正常只有简单的几步 0.1 配置数据库 0.2 定义模型 0.3 迁移文件 0.4 执行迁移生成数据表 0.5 使用模型类增删改查 2 ...

  5. SpringBoot RabbitMQ 整合使用

    ![](http://ww2.sinaimg.cn/large/006tNc79ly1g5jjb62t88j30u00gwdi2.jpg) ### 前提 上次写了篇文章,[<SpringBoot ...

  6. 消息中间件——RabbitMQ(一)Windows/Linux环境搭建(完整版)

    前言 最近在学习消息中间件--RabbitMQ,打算把这个学习过程记录下来.此章主要介绍环境搭建.此次主要是单机搭建(条件有限),包括在Windows.Linux环境下的搭建,以及RabbitMQ的监 ...

  7. CMD开放3389端口

    REG ADD HKLM\SYSTEM\CurrentControlSet\Control\Terminal" "Server /v fDenyTSConnections /t R ...

  8. 从windows10迁移到Linux Deepin

    如题, 这几天从windows系统迁移到deepin的linux系统花了很多时间, 以致最近都没时间来博客园.现在将这几天的成果分享出来, 顺便也做个记录.先不多说, 上一张新系统界面. 其实在装de ...

  9. Kubernetes容器集群管理环境 - Prometheus监控篇

    一.Prometheus介绍之前已经详细介绍了Kubernetes集群部署篇,今天这里重点说下Kubernetes监控方案-Prometheus+Grafana.Prometheus(普罗米修斯)是一 ...

  10. mysql新建用户及授权

    添加用户 CREATE USER 'username'@'localhost' IDENTIFIED BY 'password'; -- username : 自定义用户名 -- localhost ...