ZooKeeper异步调用命令
在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); }
异步调用与同步调用的两个主要区别:
- 异步调用没有返回值(void)
- 异步调用不抛出异常,异常情况都通过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 |
用于获取节点的子节点列表和状态 |
上一篇: CCF计算机职业认证考试