建立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);
}