建立Client
- 直接建立(即使用Table Store Endpoint建立Client)
Endpoint ep("YourEndpoint", "YourInstance"); Credential cr("AccessKeyId", "AccessKeySecret"); ClientOptions opts; AsyncClient* client = NULL; Optional<OTSError> res = AsyncClient::create(client, ep, cr, opts);
注意 建議您避免使用主帳號的AcceessKey來訪問Table Store,推薦使用臨時令牌或者子帳號的AccessKey。如果使用臨時令牌STS,上述代碼中的Credential對象需要修改為:Credential cr("AccessKeyId", "AccessKeySecret", "SecurityToken");
。配置項的說明參見同步介面。
- 從SyncClient構造
SyncClient& sync = ...; AsyncClient* async = AsyncClient::create(sync);
表操作
以表操作為例說明非同步介面的使用。
準備工作
需要準備兩個函數:
- 請求對象
listTable
的函數簽名如下所示:
第一個參數是可變引用(區別於同步介面,同步介面是不可變引用)。 在void listTable( ListTableRequest&, const std::tr1::function<void( ListTableRequest&, util::Optional<OTSError>&, ListTableResponse&)>&);
listTable()
返回之後(這時整個列舉表操作並沒有完成),傳入的ListTableRequest
對象可能會被改變或者析構,從而引入一些難以調查的微妙錯誤。為了避免這類問題,非同步用戶端會將傳入的請求對象裡的內容轉移(並非複製)到內部儲存起來。所以,調用了listTable()
之後,傳入的請求對象有可能被改變。 - 回呼函數
回呼函數不能返回任何值,接收參數有以下三種:
-
請求對象。其內容即使用者調用
listTable()
時傳入的請求對象。因為回調之後非同步用戶端也不再需要請求對象,於是以可變引用的方式還給使用者的回呼函數。這樣使用者可以將請求對象的內容轉移出來。 -
封裝在Optional內的錯誤對象。如果沒有錯誤,則該對象的
present()
方法返回false。 -
響應對象。與請求對象類似,響應對象也是以可變引用的方式交給回呼函數。如果有錯誤,響應對象一定是一個合法的對象(可以正常析構),但是其內容是未定義的。
说明- 非同步用戶端保證每個請求的回調一定會被調用正好一次。
- 理論上,回呼函數有可能在
listTable()
返回之前被調用。
-
樣本
void listTableCallback(
ListTableRequest&,
Optional<OTSError>& err,
ListTableResponse& resp)
{
if (err.present()) {
// 處理錯誤
} else {
const IVector<string>& xs = resp.tables();
for(int64_t i = 0; i < xs.size(); ++i) {
cout << xs[i] << endl;
}
}
}
void listTable(AsyncClient& client)
{
ListTableRequest req;
client.listTable(req, listTableCallback);
}