文章目錄
- 一、初始化、銷毀 Zookeeper 句柄
- 1)初始化zookeeper句柄
- 2)銷毀zookeeper句柄
- 二、輔助函式
- 1)設定日志等級
- 2)獲取客戶端的 session id,只有在客戶端的當前連接狀態有效時才可以,
- 3)回傳當前會話的超時時間,只有在客戶端的當前連接狀態有效時才可以,
- 4)獲取 Zookeeper 句柄的背景關系,
- 5)設定 Zookeeper 句柄的背景關系,
- 6)設定 Zookeeper 句柄的全域監視器回呼函式,該函式回傳全域監視器的舊回呼函式,
- 7)回傳當前 Zookeeper 連接的套接字地址,
- 8)獲取當前 Zookeeper 連接狀態,
- 9)回傳某一錯誤碼的字串表示,
- 10)檢查當前 Zookeeper 連接是否為不可恢復的,如果不可恢復,則客戶端需要關閉連接,然后重連,
- 三、與 zoo_multi() 和 zoo_amulti() 批量操作相關的 zoo_op_t 初始化
- 四、Zookeeper C API 同步介面
- 1)創建znode節點
- 2)洗掉znode節點
- 3)可設定 watch 的 API(exists(兩個) + get(兩個) + get_children(四個) = 八個)
- exists
- get獲取節點資料
- get_children獲取子節點串列
- 4)訪問、設定節點 ACL (兩個)
- 獲取節點 ACL 資訊
- 設定節點 ACL
- 5)批處理,即原子性地一次提交多個 Zookeeper 操作,
- 6)其他介面
- 五、Zookeeper C API 異步介面
- 1)異步創建znode節點
- 2)呼叫 exists() 和zoo_aexists()函式,設定監視器,
- 3)呼叫 delete 函式,洗掉 znode 節點,
- 4)獲得節點資料(兩個API)
- 5)獲取子節點串列 aget_children (四個)
- 6)訪問、設定節點 ACL 的 API
- 7)異步批處理 API
- 8)其他API
- 六、編譯測驗程式
一、初始化、銷毀 Zookeeper 句柄
1)初始化zookeeper句柄
ZOOAPI zhandle_t *zookeeper_init(const char *host, watcher_fn fn,
int recv_timeout,
const clientid_t * clientid,
void *context, int flags);
---------------------------
引數說明-》》》
host 逗號隔開的 host:port 對, 每個代表一個 zk server, 例如: "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002"
fn 全域的監視器回呼函式,當發生事件通知時,該函式會被呼叫,
clientid 客戶端嘗試重連的先前會話的ID,如果不需要重連先前的會話,則設定為 0,客戶端可以通過呼叫 zoo_client_id來訪
問一個已經連接上的并且有效的會話ID,如果clientid對應的會話超時,或者由于某種原因 clientid變為無效了,那么
zookeeper_init 將回傳一個非法的 zhandle_t, 通過 zhandle_t 的狀態可以獲知 zookeeper_init 呼叫失敗的原因, (通常為
ZOO_EXPIRED_SESSION_STATE).
context 與 zhandle_t 實體相關聯的“背景關系物件”(可以通過該引數為 zhandle_t 傳入自定義型別的資料),應用程式可以
通過 zoo_get_context 訪問它(例如在監視器回呼函式中),當然 zookeeper 內部沒有用到該引數,所以 context 可以設定為
NULL,
flags 目前為保留引數,設定為 0,
2)銷毀zookeeper句柄
ZOOAPI int zookeeper_close(zhandle_t * zh);
二、輔助函式
1)設定日志等級
ZOOAPI void zoo_set_debug_level(ZooLogLevel logLevel);
其中 logLevel 可以是ZOO_LOG_LEVEL_ERROR, ZOO_LOG_LEVEL_WARN, ZOO_LOG_LEVEL_INFO, ZOO_LOG_LEVEL_DEBUG四個取值,
2)獲取客戶端的 session id,只有在客戶端的當前連接狀態有效時才可以,
ZOOAPI void zoo_set_log_stream(FILE * logStream);
Zookeeper C API 默認的日志流是標準輸出,可以通過該函式設定 Zookeeper C API的日志流為檔案,
3)回傳當前會話的超時時間,只有在客戶端的當前連接狀態有效時才可以,
ZOOAPI const clientid_t *zoo_client_id(zhandle_t * zh);
4)獲取 Zookeeper 句柄的背景關系,
ZOOAPI const void *zoo_get_context(zhandle_t * zh);
5)設定 Zookeeper 句柄的背景關系,
ZOOAPI void zoo_set_context(zhandle_t * zh, void *context);
6)設定 Zookeeper 句柄的全域監視器回呼函式,該函式回傳全域監視器的舊回呼函式,
ZOOAPI watcher_fn zoo_set_watcher(zhandle_t * zh, watcher_fn newFn);
7)回傳當前 Zookeeper 連接的套接字地址,
ZOOAPI struct sockaddr *zookeeper_get_connected_host(zhandle_t * zh, struct sockaddr
*addr,
socklen_t * addr_len);
8)獲取當前 Zookeeper 連接狀態,
ZOOAPI int zoo_state(zhandle_t * zh);
9)回傳某一錯誤碼的字串表示,
ZOOAPI const char *zerror(int c);
10)檢查當前 Zookeeper 連接是否為不可恢復的,如果不可恢復,則客戶端需要關閉連接,然后重連,
ZOOAPI int is_unrecoverable(zhandle_t * zh);
// 設定日志等級、日志流
ZOOAPI void zoo_set_debug_level(ZooLogLevel logLevel);
ZOOAPI void zoo_set_log_stream(FILE * logStream);
ZOOAPI const clientid_t *zoo_client_id(zhandle_t * zh);
ZOOAPI int zoo_recv_timeout(zhandle_t * zh);
ZOOAPI const void *zoo_get_context(zhandle_t * zh);
ZOOAPI void zoo_set_context(zhandle_t * zh, void *context);
ZOOAPI watcher_fn zoo_set_watcher(zhandle_t * zh, watcher_fn newFn);
ZOOAPI struct sockaddr *zookeeper_get_connected_host(zhandle_t * zh, struct sockaddr
*addr,
socklen_t * addr_len);
ZOOAPI int zookeeper_interest(zhandle_t * zh, int *fd, int *interest,
struct timeval *tv);
ZOOAPI int zookeeper_process(zhandle_t * zh, int events);
ZOOAPI int zoo_state(zhandle_t * zh);
ZOOAPI const char *zerror(int c);
ZOOAPI int is_unrecoverable(zhandle_t * zh);
ZOOAPI void zoo_deterministic_conn_order(int yesOrNo);
三、與 zoo_multi() 和 zoo_amulti() 批量操作相關的 zoo_op_t 初始化
void zoo_create_op_init(zoo_op_t * op, const char *path, const char *value,
int valuelen, const struct ACL_vector *acl,
int flags, char *path_buffer, int path_buffer_len);
void zoo_delete_op_init(zoo_op_t * op, const char *path, int version);
void zoo_set_op_init(zoo_op_t * op, const char *path,
const char *buffer, int buflen, int version,
struct Stat *stat);
void zoo_check_op_init(zoo_op_t * op, const char *path, int version);
四、Zookeeper C API 同步介面
1)創建znode節點
ZOOAPI int zoo_create(zhandle_t * zh, const char *path,
const char *value, int valuelen,
const struct ACL_vector *acl, int flags,
char *path_buffer, int path_buffer_len);
zh zookeeper_init() 回傳的 zookeeper 句柄,
path 節點路徑,
value 該節點保存的資料,
valuelen 該節點保存資料的大小,如果 value 被設定為 NULL(該 znode 節點不包含資料),則 valuelen 應該設定為 -1,
acl 該節點初始 ACL,ACL 不能為null 或空,
flags 該引數可以設定為 0,或者創建識別符號 ZOO_EPHEMERAL, ZOO_SEQUENCE 的組合或(OR),
path_buffer 用于保存回傳節點新路徑(因為設定了 ZOO_SEQUENCE 后 zoo_create 所創建的節點名稱與引數 path 提供的名稱不同,新的節點名稱后面填充了序號),path 字串以 NULL 結束,path_buffer 可以設定為 NULL,此時 path_buffer_len 等于 0,
path_buffer_len path_buffer 的長度,如果新節點名稱的長度大于path_buffer_len,則節點名稱將會被截斷,而服務器端該節點的名稱不會截斷,
2)洗掉znode節點
ZOOAPI int zoo_delete(zhandle_t * zh, const char *path, int version);
zh zookeeper_init() 回傳的 zookeeper 句柄,
path 節點路徑,
version 節點的版本號,如果該 znode 節點的實際版本號與該引數提供的版本號不一值,則洗掉節點失敗,如果 version 為 -1,則不作版本檢查,
3)可設定 watch 的 API(exists(兩個) + get(兩個) + get_children(四個) = 八個)
exists
- zoo_exists() 和 zoo_wexists()的區別
檢查節點狀態 exists(兩個,分別是 zoo_exists() 和 zoo_wexists(),區別是后者可以指定單獨的 watcher_fn(監視器回呼函式),而前者只能用 zookeeper_init() 設定的全域監視器回呼函式,同時 get 和 get_children兩族函式也一樣,帶有zoo_w* 的函式可以指定單獨的 watcher_fn),
ZOOAPI int zoo_exists(zhandle_t * zh, const char *path, int watch,
struct Stat *stat);
ZOOAPI int zoo_wexists(zhandle_t * zh, const char *path,
watcher_fn watcher, void *watcherCtx,
struct Stat *stat);
- 引數說明
zh zookeeper_init() 回傳的 zookeeper 句柄,
path 節點路徑,
watch 如果非 0,則在服務器端設定監視,當節點發生變化時客戶端會得到通知,即使當前指定的節點不存在也會設定監視,這樣該節點被創建時,客戶端也可以得到通知,
stat 回傳的 Stat 資訊,
watcherCtx 用戶指定的資料,將被傳入到監視器回呼函式中,與由 zookeeper_init() 設定的全域監視器背景關系不同,該函式設定的監視器背景關系只與當前的監視器相關聯,
get獲取節點資料
ZOOAPI int zoo_get(zhandle_t * zh, const char *path, int watch,
char *buffer, int *buffer_len, struct Stat *stat);
--------------------
zh zookeeper_init() 回傳的 zookeeper 句柄,
path 節點路徑,
watch 如果非0,則在服務器端設定監視,當節點發生變化時客戶端會得到通知,
buffer 用于保存從 zookeeper 服務器獲取的節點資料,
buffer_len buffer 大小,一旦成功回傳該值將會被設定為節點資料的實際大小,如果節點的資料為空,則資料大小為 -1,buffer_len 也為 -1,
stat 如果非空,stat 指向的結構將會保存該節點的 Stat 資訊,
ZOOAPI int zoo_wget(zhandle_t * zh, const char *path,
watcher_fn watcher, void *watcherCtx,
char *buffer, int *buffer_len, struct Stat *stat);
-----------------------
zh zookeeper_init() 回傳的 zookeeper 句柄,
path 節點路徑,
watcher 如果不為 NULL 則會在服務器端設定監視,當節點發生變化時客戶端會得到通知,
watcherCtx 用戶指定的資料,將被傳入到監視器回呼函式中,與由 zookeeper_init() 設定的全域監視器背景關系不同,該函式設定的監視器背景關系只與當前的監視器相關聯,
buffer 用于保存從 zookeeper 服務器獲取的節點資料,
buffer_len buffer 大小,一旦成功回傳該值將會被設定為節點資料的實際大小,如果節點的資料為空,則資料大小為 -1,buffer_len 也為 -1,
stat 如果非空,stat 指向的結構將會保存該節點的 Stat 資訊,
get_children獲取子節點串列
ZOOAPI int zoo_get_children(zhandle_t * zh, const char *path,
int watch, struct String_vector *strings);
--------------------
zh zookeeper_init() 回傳的 zookeeper 句柄,
path 節點路徑,
watch 如果非0,則在服務器端設定監視,當節點發生變化時客戶端會得到通知,
strings 回傳各個子節點路徑
ZOOAPI int zoo_wget_children(zhandle_t * zh, const char *path,
watcher_fn watcher, void *watcherCtx,
struct String_vector *strings);
---------------------
zh zookeeper_init() 回傳的 zookeeper 句柄,
path 節點路徑,
watcher 如果不為 NULL 則會在服務器端設定監視,當節點發生變化時客戶端會得到通知,
watcherCtx 用戶指定的資料,將被傳入到監視器回呼函式中,與由 zookeeper_init() 設定的全域監視器背景關系不同,該函式設定的監視器背景關系只與當前的監視器相關聯,
strings 回各個子節點路徑
ZOOAPI int zoo_get_children2(zhandle_t * zh, const char *path,
int watch, struct String_vector *strings,
struct Stat *stat);
-----------------------------
該函式最早出現在 Zookeeper 3.3.0中,該函式功能與 zoo_get_children() 基本一致,但同時還會回傳指定節點的 Stat 資訊,
zh zookeeper_init() 回傳的 zookeeper 句柄,
path 節點路徑,
watch 如果非0,則在服務器端設定監視,當節點發生變化時客戶端會得到通知,
strings 回傳各個子節點路徑,
stat 回傳指定節點的 Stat 資訊,
ZOOAPI int zoo_wget_children2(zhandle_t * zh, const char *path,
watcher_fn watcher, void *watcherCtx,
struct String_vector *strings,
struct Stat *stat);
------------------------
ZOOAPI int zoo_wget_children2(zhandle_t * zh, const char *path,
watcher_fn watcher, void *watcherCtx,
struct String_vector *strings,
struct Stat *stat);
該函式最早出現在 Zookeeper 3.3.0中,該函式功能與 zoo_wget_children() 基本一致,但同時還會回傳指定節點的 Stat 資訊,
zh zookeeper_init() 回傳的 zookeeper 句柄,
path 節點路徑,
watcher 如果不為 NULL 則會在服務器端設定監視,當節點發生變化時客戶端會得到通知,
watcherCtx 用戶指定的資料,將被傳入到監視器回呼函式中,與由 zookeeper_init() 設定的全域監視器背景關系不同,該函式設定的監視器背景關系只與當前的監視器相關聯,
strings 回傳各個子節點路徑,
stat 回傳指定節點的 Stat 資訊,
4)訪問、設定節點 ACL (兩個)
獲取節點 ACL 資訊
ZOOAPI int zoo_get_acl(zhandle_t * zh, const char *path, struct ACL_vector *acl, struct Stat *stat);
zh zookeeper_init() 回傳的 zookeeper 句柄,
path 節點路徑,
acl 該函式所回傳的指定節點的 ACL 資訊,
stat 回傳指定節點的 Stat 資訊,
設定節點 ACL
ZOOAPI int zoo_set_acl(zhandle_t * zh, const char *path, int version, const struct ACL_vector *acl);
zh zookeeper_init() 回傳的 zookeeper 句柄,
path 節點路徑,
version 節點的版本號,
acl 需要設定的 ACL 資訊,
5)批處理,即原子性地一次提交多個 Zookeeper 操作,
ZOOAPI int zoo_multi(zhandle_t * zh, int count, const zoo_op_t * ops,
zoo_op_result_t * results);
zh zookeeper_init() 回傳的 zookeeper 句柄,
count 提交操作的個數,
ops 包含所提交操作陣列,
results 包含操作所回傳結果的陣列,
zoo_opt_t結構體(其中 zoo_op_t 是各種操作(創建、洗掉節點,設定節點資料和檢查節點狀態四種操作)一個封裝(聯合體),定義如下:)
typedef struct zoo_op {
int type;
union {
// CREATE
struct {
const char *path;
const char *data;
int datalen;
char *buf;
int buflen;
const struct ACL_vector *acl;
int flags;
} create_op;
// DELETE
struct {
const char *path;
int version;
} delete_op;
// SET
struct {
const char *path;
const char *data;
int datalen;
int version;
struct Stat *stat;
} set_op;
// CHECK
struct {
const char *path;
int version;
} check_op;
};
} zoo_op_t;
zoo_op_t一般由以下四個函式初始化
void zoo_create_op_init(zoo_op_t * op, const char *path, const char *value,
int valuelen, const struct ACL_vector *acl,
int flags, char *path_buffer, int path_buffer_len);
void zoo_delete_op_init(zoo_op_t * op, const char *path, int version);
void zoo_set_op_init(zoo_op_t * op, const char *path,
const char *buffer, int buflen, int version,
struct Stat *stat);
void zoo_check_op_init(zoo_op_t * op, const char *path, int version);
zoo_op_result_t 用于保存 zoo_multi 或者 zoo_amulti 回傳的其中一個結果,定義如下:
typedef struct zoo_op_result {
int err;
char *value;
int valuelen;
struct Stat *stat;
} zoo_op_result_t;
6)其他介面
ZOOAPI int zoo_add_auth(zhandle_t * zh, const char *scheme,
const char *cert, int certLen,
void_completion_t completion, const void *data);
ZOOAPI int zoo_set(zhandle_t * zh, const char *path,
const char *buffer, int buflen, int version);
ZOOAPI int zoo_set2(zhandle_t * zh, const char *path,
const char *buffer, int buflen, int version,
struct Stat *stat);
五、Zookeeper C API 異步介面
1)異步創建znode節點
//異步方式創建znode節點
ZOOAPI int zoo_acreate(zhandle_t * zh, const char *path,
const char *value, int valuelen,
const struct ACL_vector *acl, int flags,
string_completion_t completion, const void *data);
---------------
引數說明:
zh zookeeper_init() 回傳的 zookeeper 句柄,
path 節點路徑,
value 該節點保存的資料,
valuelen 該節點保存資料的大小,
acl 該節點初始 ACL,ACL 不能為null 或空,
flags 該引數可以設定為 0,或者創建識別符號 ZOO_EPHEMERAL, ZOO_SEQUENCE 的組合或(OR),
completion 當創建節點請求完成時會呼叫該函式,該函式原型詳見第三講《回呼函式》一節,同時傳遞給completion的 rc參
數為: ZOK 操作完成;ZNONODE 父節點不存在;ZNODEEXISTS 節點已存在;ZNOAUTH 客戶端沒有權限創建節點,
ZNOCHILDRENFOREPHEMERALS 臨時節點不能創建子節點,
data completino函式被呼叫時,傳遞給 completion 的資料,
- 使用舉例
// struct ACL ALL_ACL[] = {{ZOO_PERM_ALL, ZOO_ANYONE_ID_UNSAFE}};
// struct ACL_vector ALL_PERMS = {1, ALL_ACL};
int ret = zoo_acreate(zkhandle, "/xyz", "hello", 5,
&ZOO_OPEN_ACL_UNSAFE, 0 /* ZOO_SEQUENCE */,
zktest_string_completion, "acreate");
if (ret) {
fprintf(stderr, "Error %d for %s\n", ret, "acreate");
exit(EXIT_FAILURE);
}
2)呼叫 exists() 和zoo_aexists()函式,設定監視器,
- 代碼舉例
void zktest_stat_completion(int rc, const struct Stat *stat, const void *data)
{
fprintf(stderr, "%s: rc = %d Stat:\n", (char*)data, rc);
zktest_dump_stat(stat);
}
//main
ret = zoo_aexists(zkhandle, "/xyz", 1, zktest_stat_completion, "aexists");
if (ret) {
fprintf(stderr, "Error %d for %s\n", ret, "aexists");
exit(EXIT_FAILURE);
}
- 函式原型
ZOOAPI int zoo_aexists(zhandle_t * zh, const char *path, int watch,
stat_completion_t completion, const void *data);
zh zookeeper_init() 回傳的 zookeeper 句柄,
path 節點路徑,
watcher 如果非 0,則在服務器端設定監視,當節點發生變化時客戶端會得到通知,即使當前指定的節點不存在也會設定監視,這樣該節點被創建時,客戶端也可以得到通知,
watcherCtx 用戶指定的資料,將被傳入到監視器回呼函式中,與由 zookeeper_init() 設定的全域監視器背景關系不同,該函式設定的監視器背景關系只與當前的監視器相關聯,
completion 當 zoo_awexists 請求完成時會呼叫該函式,該函式原型詳見第三講《回呼函式》一節,同時傳遞給completion的 rc引數為: ZOK 操作完成;ZNONODE 節點不存在;ZNOAUTH 客戶端沒有權限洗掉節點,
data completion 函式被呼叫時,傳遞給 completion 的資料,
3)呼叫 delete 函式,洗掉 znode 節點,
- 代碼舉例
void zktest_void_completion(int rc, const void *data)
{
fprintf(stderr, "[%s]: rc = %d\n", (char*)(data==0?"null":data), rc);
}
//main
ret = zoo_adelete(zkhandle, "/xyz", -1, zktest_void_completion, "adelete");
if (ret) {
fprintf(stderr, "Error %d for %s\n", ret, "adelete");
exit(EXIT_FAILURE);
}
- 原型
ZOOAPI int zoo_adelete(zhandle_t * zh, const char *path, int version,
void_completion_t completion, const void *data);
//其中 zoo_op_t 是各種操作(創建、洗掉節點,設定節點資料和檢查節點狀態四種操作)一個封裝(聯合體),定義如下:
zh zookeeper_init() 回傳的 zookeeper 句柄,
path 節點路徑,
version 期望的節點版本號,如果真實的版本號與期望的版本號不同則 zoo_delete() 呼叫失敗,-1 表示不不檢查版本號,
completion 當洗掉節點請求完成時會呼叫該函式,該函式原型詳見第三講《回呼函式》一節,同時傳遞給completion的 rc引數為: ZOK 操作完成;ZNONODE 節點不存在;ZNOAUTH 客戶端沒有權限洗掉節點;ZBADVERSION 版包號不匹配;ZNOTEMPTY 當前節點存在子節點,不能被洗掉,
data completion 函式被呼叫時,傳遞給 completion 的資料,
4)獲得節點資料(兩個API)
ZOOAPI int zoo_aget(zhandle_t * zh, const char *path, int watch,
data_completion_t completion, const void *data);
ZOOAPI int zoo_awget(zhandle_t * zh, const char *path,
watcher_fn watcher, void *watcherCtx,
data_completion_t completion, const void *data);
zh zookeeper_init() 回傳的 zookeeper 句柄,
path 節點路徑,
watcher 如果非 0,則在服務器端設定監視,當節點發生變化時客戶端會得到通知,即使當前指定的節點不存在也會設定監視,這樣該節點被創建時,客戶端也可以得到通知,
watcherCtx 用戶指定的資料,將被傳入到監視器回呼函式中,與由 zookeeper_init() 設定的全域監視器背景關系不同,該函式設定的監視器背景關系只與當前的監視器相關聯,
completion 當 zoo_awget 請求完成時會呼叫該函式,該函式原型詳見第三講《回呼函式》一節,同時傳遞給completion的 rc引數為: ZOK 操作完成;ZNONODE 節點不存在;ZNOAUTH 客戶端沒有權限洗掉節點,
data completion 函式被呼叫時,傳遞給 completion 的資料,
5)獲取子節點串列 aget_children (四個)
ZOOAPI int zoo_aget_children(zhandle_t * zh, const char *path,
int watch,
strings_completion_t completion,
const void *data);
ZOOAPI int zoo_awget_children(zhandle_t * zh, const char *path,
watcher_fn watcher, void *watcherCtx,
strings_completion_t completion,
const void *data);
ZOOAPI int zoo_aget_children2(zhandle_t * zh, const char *path,
int watch,
strings_stat_completion_t completion,
const void *data);
ZOOAPI int zoo_awget_children2(zhandle_t * zh, const char *path,
watcher_fn watcher, void *watcherCtx,
strings_stat_completion_t completion,
const void *data);
zh zookeeper_init() 回傳的 zookeeper 句柄,
path 節點路徑,
watcher 如果非 0,則在服務器端設定監視,當節點發生變化時客戶端會得到通知,即使當前指定的節點不存在也會設定監視,這樣該節點被創建時,客戶端也可以得到通知,
watcherCtx 用戶指定的資料,將被傳入到監視器回呼函式中,與由 zookeeper_init() 設定的全域監視器背景關系不同,該函式設定的監視器背景關系只與當前的監視器相關聯,
completion 當zoo_awget_children2 請求完成時會呼叫該函式,該函式原型詳見第三講《回呼函式》一節,同時傳遞給completion的 rc引數為: ZOK 操作完成;ZNONODE 節點不存在;ZNOAUTH 客戶端沒有權限洗掉節點,
data completion 函式被呼叫時,傳遞給 completion 的資料,
6)訪問、設定節點 ACL 的 API
ZOOAPI int zoo_aget_acl(zhandle_t * zh, const char *path,
acl_completion_t completion, const void *data);
----------------
zh zookeeper_init() 回傳的 zookeeper 句柄,
path 節點路徑,
completion 當 zoo_aget_acl 請求完成時會呼叫該函式,該函式原型詳見第三講《回呼函式》一節,同時傳遞給completion的 rc引數為: ZOK 操作完成;ZNONODE 節點不存在;ZNOAUTH 客戶端沒有權限洗掉節點,
data completion 函式被呼叫時,傳遞給 completion 的資料,
ZOOAPI int zoo_aset_acl(zhandle_t * zh, const char *path, int version,
struct ACL_vector *acl, void_completion_t,
const void *data);
---------------
zh zookeeper_init() 回傳的 zookeeper 句柄,
path 節點路徑,
buffer 保存需要設定的 ACL,
buflen buffer 的長度,
completion 當 zoo_aset_acl 請求完成時會呼叫該函式,該函式原型詳見第三講《回呼函式》一節,同時傳遞給completion的 rc引數為: ZOK 操作完成;ZNONODE 節點不存在;ZNOAUTH 客戶端沒有權限洗掉節點;ZINVALIDACL 非法 ACL;ZBADVERSION 版本號不匹配,
data completion 函式被呼叫時,傳遞給 completion 的資料,
7)異步批處理 API
ZOOAPI int zoo_amulti(zhandle_t * zh, int count, const zoo_op_t * ops,
zoo_op_result_t * results, void_completion_t,
const void *data);
異步批處理與同步批處理方式類似見《Zookeeper C API 指南五(同步 API 介紹)》,只是需要額外設定一個 void_completion_t 回呼函式,在此不再贅述,
8)其他API
ZOOAPI int zoo_async(zhandle_t * zh, const char *path,
string_completion_t completion, const void *data);
ZOOAPI int zoo_aget_acl(zhandle_t * zh, const char *path,
acl_completion_t completion, const void *data);
ZOOAPI int zoo_aset_acl(zhandle_t * zh, const char *path, int version,
struct ACL_vector *acl, void_completion_t,
const void *data);
ZOOAPI int zoo_amulti(zhandle_t * zh, int count, const zoo_op_t * ops,
zoo_op_result_t * results, void_completion_t,
const void *data);
六、編譯測驗程式
1)頭檔案包含 #include <zookeeper/zookeeper.h>
2)如果你需要編譯多執行緒版本客戶端程式,請添加編譯選項 -DTHREADED,同時鏈接時應鏈接 zookeeper_mt 庫;如果你需要編譯單執行緒客戶端程式,請不要添加編譯選項 -DTHREADED,同時鏈接時應鏈接 zookeeper_st 庫,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/345678.html
標籤:其他
