新建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来访问表格存储,推荐使用临时令牌或者子账号的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);
}