接上一篇《Zookeeper C API 指南二(監視(Wathes), 基本常量和結構體介紹)》,本文重點介紹 Zookeeper C API 中的各種回調函數。
Zookeeper C API 中各種回調函數簡介
在具體介紹 Zookeeper C API 之前,首先介紹一下 Zookeeper C API 中的各種回調函數的原型:
監視函數(watch function)原型
typedef void (*watcher_fn)(zhandle_t *zh, int type, int state, const char *path,void *watcherCtx);
監視函數原型的各個參數解釋如下:
| zh | zookeeper 句柄(handle) |
| type | 事件類型(event type). *_EVENT 常量之一. |
| state | 連接狀態(connection state). 狀態值為 *_STATE 常量之一. |
| path | 觸發監視事件的 znode 節點的路徑,若為 NULL,則事件類型為 ZOO_SESSION_EVENT |
| watcherCtx | 監視器上下文(watcher context). |
其他回調函數的原型
Zookeeper 中還有幾種在異步 API(一般以 zoo_a*開頭的函數) 中使用的回調函數,根據回調函數處理異步函數返回值類型的不同分為以下幾類:處理返回 void 類型的回調函數,處理返回 Stat 結構的回調函數,處理返回字符串的回調函數,處理返回數據的回調函數,處理返回字符串列表(a list of string)的回調函數,同時處理返回字符串列表(a list of string)和 Stat 結構的回調函數,以及處理返回 ACL 信息的回調函數,它們分別如下:
// 處理返回 void 類型的回調函數 typedef void(* void_completion_t)(int rc, const void *data); // 處理返回 Stat 結構的回調函數 typedef void(* stat_completion_t)(int rc, const struct Stat *stat, const void *data); // 處理返回字符串的回調函數 typedef void(* string_completion_t)(int rc, const char *value, const void *data); // 處理返回數據的回調函數 typedef void(* data_completion_t)(int rc, const char *value, int value_len, const struct Stat *stat, const void *data); // 處理返回字符串列表(a list of string)的回調函數 typedef void(* strings_completion_t)(int rc, const struct String_vector *strings, const void *data); // 同時處理返回字符串列表(a list of string)和 Stat 結構的回調函數 typedef void(* strings_stat_completion_t)(int rc, const struct String_vector *strings, const struct Stat *stat, const void *data); // 處理以及返回 ACL 信息的回調函數 typedef void(* acl_completion_t)(int rc, struct ACL_vector *acl, struct Stat *stat, const void *data);
下面一一介紹上述幾種回調函數的用法:
- 處理返回 void 類型的回調函數
typedef void(* void_completion_t)(int rc, const void *data)
該回調函數一般在異步 API 調用結束或 Zookeeper 客戶端失去連接時被調用。
| rc | 異步函數調用返回的錯誤碼,連接丟失/超時將觸發該原型函數(此處指具有該函數原型的回調函數,下同)的調用,並且錯誤碼為 ZCONNECTIONLOSS -- Zookeeper 客戶端與服務器端的連接丟失,或者 ZOPERATIONTIMEOUT -- 連接超時;而與數據相關的事件也會觸發該原型函數的調用,同時置相應的錯誤碼,具體見后文(0 代異步函數調用成功) |
| data | 由調用者傳入的指針,調用者可以通過該指針向回調函數傳入自定義的參數,開發人員應負責此指針所指向內存的釋放。 |
- 處理返回 Stat 結構的回調函數
typedef void(* stat_completion_t)(int rc, const struct Stat *stat, const void *data)
該函數一般在異步 API 調用結束或 Zookeeper 客戶端失去連接時被調用。
| rc | 異步函數調用返回的錯誤碼,連接丟失/超時將觸發該原型函數(此處指具有該函數原型的回調函數,下同)的調用,並且錯誤碼為 ZCONNECTIONLOSS -- Zookeeper 客戶端與服務器端的連接丟失,或者 ZOPERATIONTIMEOUT -- 連接超時;而與數據相關的事件也會觸發該原型函數的調用,同時置相應的錯誤碼,具體見后文(0 代異步函數調用成功) |
| stat | 指向與該 znode 節點相關的 Stat 信息,如果返回非 0 值(即異步調用函數出錯),stat 所指向的區域是未定義的,開發者不負責釋放 stat 所指向的內存空間。 |
| data | 由調用者傳入的指針,調用者可以通過該指針向回調函數傳入自定義的參數,開發人員應負責此指針所指向內存的釋放。 |
- 處理返回字符串的回調函數
typedef void(* string_completion_t)(int rc, const char *value, const void *data)
該函數一般在異步 API 調用結束或 Zookeeper 客戶端失去連接時被調用。
| rc | 異步函數調用返回的錯誤碼,連接丟失/超時將觸發該原型函數(此處指具有該函數原型的回調函數,下同)的調用,並且錯誤碼為 ZCONNECTIONLOSS -- Zookeeper 客戶端與服務器端的連接丟失,或者 ZOPERATIONTIMEOUT -- 連接超時;而與數據相關的事件也會觸發該原型函數的調用,同時置相應的錯誤碼,具體見后文(0 代異步函數調用成功) |
| value | 返回的字符串 |
| data | 由調用者傳入的指針,調用者可以通過該指針向回調函數傳入自定義的參數,開發人員應負責此指針所指向內存的釋放。 |
- 處理返回數據的回調函數
typedef void(* data_completion_t)(int rc, const char *value, int value_len, const struct Stat *stat, const void *data)
該函數一般在異步 API 調用結束或 Zookeeper 客戶端失去連接時被調用。
| rc | 異步函數調用返回的錯誤碼,連接丟失/超時將觸發該原型函數(此處指具有該函數原型的回調函數,下同)的調用,並且錯誤碼為 ZCONNECTIONLOSS -- Zookeeper 客戶端與服務器端的連接丟失,或者 ZOPERATIONTIMEOUT -- 連接超時;而與數據相關的事件也會觸發該原型函數的調用,同時置相應的錯誤碼,具體見后文(0 代異步函數調用成功) |
| value | 異步調用的返回值,如果返回非 0 值(即異步調用函數出錯),value 所指向的區域是未定義的,開發者不負責釋放 value 所指向的內存空間。 |
| value_len | 返回 value 數據字節數(bytes) |
| stat | 指向與該 znode 節點相關的 Stat 信息,如果返回非 0 值(即異步調用函數出錯),stat 所指向的區域是未定義的,開發者不負責釋放 stat 所指向的內存空間。 |
| data | 由調用者傳入的指針,調用者可以通過該指針向回調函數傳入自定義的參數,開發人員應負責此指針所指向內存的釋放。 |
- 處理返回字符串列表(a list of string)的回調函數
typedef void(* strings_completion_t)(int rc, const struct String_vector *strings, const void *data)
該函數一般在異步 API 調用結束或 Zookeeper 客戶端失去連接時被調用。
| rc | 異步函數調用返回的錯誤碼,連接丟失/超時將觸發該原型函數(此處指具有該函數原型的回調函數,下同)的調用,並且錯誤碼為 ZCONNECTIONLOSS -- Zookeeper 客戶端與服務器端的連接丟失,或者 ZOPERATIONTIMEOUT -- 連接超時;而與數據相關的事件也會觸發該原型函數的調用,同時置相應的錯誤碼,具體見后文(0 代異步函數調用成功) |
| strings | 指向包含了某 znode 節點的所有子節點名稱列表的結構,如果返回非 0 值(即異步調用函數出錯),strings 所指向的區域是未定義的,開發者不負責釋放 strings 所指向的內存空間。 |
| data | 由調用者傳入的指針,調用者可以通過該指針向回調函數傳入自定義的參數,開發人員應負責此指針所指向內存的釋放。 |
- 同時處理返回字符串列表(a list of string)和 Stat 結構的回調函數
typedef void(* strings_stat_completion_t)(int rc, const struct String_vector *strings, const struct Stat *stat, const void *data)
該函數一般在異步 API 調用結束或 Zookeeper 客戶端失去連接時被調用。
| rc | 異步函數調用返回的錯誤碼,連接丟失/超時將觸發該原型函數(此處指具有該函數原型的回調函數,下同)的調用,並且錯誤碼為 ZCONNECTIONLOSS -- Zookeeper 客戶端與服務器端的連接丟失,或者 ZOPERATIONTIMEOUT -- 連接超時;而與數據相關的事件也會觸發該原型函數的調用,同時置相應的錯誤碼,具體見后文(0 代異步函數調用成功) |
| strings | 指向包含了某 znode 節點的所有子節點名稱列表的結構,如果返回非 0 值(即異步調用函數出錯),strings 所指向的區域是未定義的,開發者不負責釋放 strings 所指向的內存空間。 |
| stat | 指向與該 znode 節點相關的 Stat 信息,如果返回非 0 值(即異步調用函數出錯),stat 所指向的區域是未定義的,開發者不負責釋放 stat 所指向的內存空間。 |
| data | 由調用者傳入的指針,調用者可以通過該指針向回調函數傳入自定義的參數,開發人員應負責此指針所指向內存的釋放。 |
- 處理返回 ACL 信息的回調函數
typedef void(* acl_completion_t)(int rc, struct ACL_vector *acl, struct Stat *stat, const void *data)
該函數一般在異步 API 調用結束或 Zookeeper 客戶端失去連接時被調用。
| rc | 異步函數調用返回的錯誤碼,連接丟失/超時將觸發該原型函數(此處指具有該函數原型的回調函數,下同)的調用,並且錯誤碼為 ZCONNECTIONLOSS -- Zookeeper 客戶端與服務器端的連接丟失,或者 ZOPERATIONTIMEOUT -- 連接超時;而與數據相關的事件也會觸發該原型函數的調用,同時置相應的錯誤碼,具體見后文(0 代異步函數調用成功) |
| acl | 指向包含某 znode 節點 ACL 信息的指針,如果返回非 0 值(即異步調用函數出錯),acl 所指向的區域是未定義的,開發者不負責釋放 acl 所指向的內存空間。 |
| stat | 指向與該 znode 節點相關的 Stat 信息,如果返回非 0 值(即異步調用函數出錯),stat 所指向的區域是未定義的,開發者不負責釋放 stat 所指向的內存空間。 |
| data | 由調用者傳入的指針,調用者可以通過該指針向回調函數傳入自定義的參數,開發人員應負責此指針所指向內存的釋放。 |
至此,所有的回調函數均已介紹完畢,下一節將介紹 Zookeeper C API 分類和基本 API 的使用,見第四講《Zookeeper C API 指南四(C API 概覽)》
