在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. 使用Docker运行SQL Server

    现在.net core已经跨平台了,大家也都用上了linux用上了docker.跟.net经常配套使用的SQL SERVER以前一直是windows only,但是从SQL Server 2017开始 ...

  2. thinkphp 数据库操作

    //所有的数据中,查出某个字段$result = $music->field('music')->select();$hotlist = M('News')->where('stat ...

  3. HTML--表格与表单(练习做注册页面)

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. Java&mysql:过滤文件内容,将新文件内容存入mysql数据库

    在上一篇博文jdbc连接数据库中我已经简单介绍了如何连接到mysql数据库,今天要总结的是学长给我布置的一个小作业,把一个很大的已经用","分开了的一行一行的txt文件内容过滤掉注 ...

  5. Javaweb入门 数据库第二天

    接着说昨天语法中提到的drop,delete和truncate的区别 drop用于删除库和表,不能用于删除表记录 delete和truncate都可以用于删除表记录,不能用于删除库和表 而delete ...

  6. Java_转换流和缓冲流

    今日内容介绍 转换流 缓冲流 1 转换流 在学习字符流(FileReader.FileWriter)的时候,其中说如果需要指定编码和缓冲区大小时,可以在字节流的基础上,构造一个InputStreamR ...

  7. VS、C#配置R语言开发环境

    R语言学习笔记(一)——在Vs.C#中配置R语言开发环境. 最近在学习小众的R语言,所以将遇到的问题记录下来供大家参考,不足之处欢迎大家交流指正. 至于R语言的介绍就不多说了,它集成了复杂的数学算法, ...

  8. Flink状态专题:keyed state和Operator state

            众所周知,flink是有状态的计算.所以学习flink不可不知状态.         正好最近公司有个需求,要用到flink的状态计算,需求是这样的,收集数据库新增的数据.       ...

  9. 第三章、Go-内建容器

    3.1.数组 (1)数组的定义 package main import ( "fmt" ) func main() { //用var定义数组可以不用赋初值 var arr1 [5] ...

  10. Oracle DBLink跨数据库访问SQL server数据同步 踩坑实录

    项目需求:这里暂且叫A公司吧,A公司有一套人事管理软件,需要与我们公司的软件做人员信息同步,A公司用的是SQL server数据库,我们公司用的Oracle,接口都不会开发(一万句"fuck ...