在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. oracle分隔字符串列转行

    1. DEMO: SELECT REGEXP_SUBSTR('1,2', '[^,]+', 1, LEVEL)          FROM DUAL        CONNECT BY REGEXP_ ...

  2. MySql(Windows)

    百度云:链接:http://pan.baidu.com/s/1nvlSzMh      密码:o1cw 官网下载网址:http://dev.mysql.com/downloads/mysql/

  3. Office2010安装问题锦集

    问题一,每次打开office 2010,都会出现重新配置的对话框. 解决姿势: 大部分搜索到的解决方法大概有2种, 一个是修改注册表,在注册表中这个这个位置增加一个名为NoRereg的32位World ...

  4. Clock Crossing Adapter传输效率分析 (Latency增加,传输效率降低)

    原创By DeeZeng [ Intel FPGA笔记 ] 在用Nios II测试 DDR3时候发现一个现象 (测试为:写全片,读全片+比对) 用单独的PLL产生时钟(200MHz)驱动 Nios I ...

  5. Soso(嗖嗖)移动 java 项目

    1.接口 通话服务 package Soso; // 接口 通话服务 public interface CallService { public abstract int call(int minCo ...

  6. mybatis01-1测试

    首先需要数据源信息和日志文件 然后一个SQLMapConfig.xml配置文件连接数据库并且映射后一个xml文件,另一个xml文件写入SQL语句, 最后text测试文件读取第一个配置文件,放到SQLS ...

  7. 原创:微信小程序如何使用自定义组件

    本博文是通过实际开发中的一个实例来讲解自定义组件的使用. 第一步:新建自定义组件目录,如图,我新建了个componts和tabList目录,然后右键tabList目录选择新建compont取名为tab ...

  8. 分布式ID系列(3)——数据库自增ID机制适合做分布式ID吗

    数据库自增ID机制原理介绍 在分布式里面,数据库的自增ID机制的主要原理是:数据库自增ID和mysql数据库的replace_into()函数实现的.这里的replace数据库自增ID和mysql数据 ...

  9. 史上最全面的SignalR系列教程-1、认识SignalR

    SignalR 是什么? SignalR 是一个面向 ASP.NET 开发人员的库,可简化将实时 web 功能添加到应用程序的过程. 实时 web 功能是让服务器代码将内容推送到连接的客户端立即可用, ...

  10. centos虚拟机配置静态ip

    昨天在配置虚拟机的时候因为之前没有设置静态IP,而是使用DHCP动态分配的,导致关机后下次开机虚拟机的ip是随机变动的.严重影响了工作体验啊,遂设置静态ip以保全! 虚拟机使用的是CentOS6.5, ...