tencent cloud

文档反馈

更新数据

最后更新时间:2020-11-20 14:56:49

    前提

    成功创建:集群,表格组,tb_online 表

    tb_online 表描述文件 table_test.proto 如下:(tcaplusservice.optionv1.proto 为依赖表)

    syntax = "proto2";
    
    package myTcaplusTable;
    
    import "tcaplusservice.optionv1.proto";
    
    message tb_online {
        option(tcaplusservice.tcaplus_primary_key) = "openid,tconndid,timekey";
    
        required int32 openid = 1; //QQ Uin
        required int32 tconndid = 2;
        required string timekey = 3;
        required string gamesvrid = 4;
        optional int32 logintime = 5 [default = 1];
        repeated int64 lockid = 6 [packed = true]; //repeated 类型字段使用 packed 关键字修饰
        optional pay_info pay = 7;
    
        message pay_info {
            optional uint64 total_money = 1;
            optional uint64 pay_times = 2;
        }
    }

    步骤1:定义配置参数

    // 目标集群的访问地址
    static const char DIR_URL_ARRAY[][TCAPLUS_MAX_STRING_LENGTH] =
    {
       "tcp://10.191.***.99:9999",
       "tcp://10.191.***.88:9999"
    };
    // 目标集群的地址个数
    static const int32_t DIR_URL_COUNT = 2;
    // 目标业务的集群 ID
    static const int32_t APP_ID = 3;
    // 目标业务的表格组 ID
    static const int32_t ZONE_ID = 1;
    // 目标业务的业务密码
    static const char * SIGNATURE = "*******";
    // 目标业务的表名 tb_online
    static const char * TABLE_NAME = "tb_online";

    步骤2:初始化 TcaplusPB客户端

    //Tcaplus PB API 客户端
    TcaplusAsyncPbApi g_stAsyncApi;
    int32_t InitAsyncPbApi()
    {
        //PB API 配置
        ClientOptions cfg;
        cfg.app_id = APP_ID;
        cfg.zones.push_back(ZONE_ID);
        strcpy(cfg.signature, SIGNATURE);
        for (int32_t i = 0; i < DIR_URL_COUNT; i++)
        {
            cfg.dirs.push_back(DIR_URL_ARRAY[i]);
        }
        //访问的 PB 表
        cfg.tables.push_back(TABLE_NAME);
        //日志配置
        strncpy(cfg.log_cfg, "tlogconf.xml", sizeof(cfg.log_cfg));
        //初始化连接超时时间5s
        cfg.timeout = 5000;
    
        //初始化连接
        int32_t iRet = g_stAsyncApi.Init(cfg);
        if (0 != iRet)
        {
            cout << "ERROR: g_stAsyncApi.Init failed, log cfg: " << cfg.log_cfg << ", iRet: " << iRet << "." << endl;
            return iRet;
        }
        return iRet;
    }

    步骤3:定义异步回调

    //收到响应消息计数
    uint32_t g_dwTotalRevNum = 0;
    class CommonCallback : public TcaplusPbCallback
    {
    public:
        CommonCallback()
        {
            cout << "Init CommonCallback." << endl;
        }
    
        ~CommonCallback()
        {
            cout << "Fini ~CommonCallback." << endl;
        }
        //收到响应消息的回调,msgs 为获取的记录的数组
        int OnRecv(const std::vector< ::google::protobuf::Message *> &msgs)
        {
            cout << "OnRecv[" << msgs.size() << endl;
            g_dwTotalRevNum++;
            for (size_t idx = 0; idx < msgs.size(); idx++)
            {
                tb_online* t = dynamic_cast<tb_online *>(msgs[idx]);
                if (NULL == t)
                {
                    cout << "ERROR: msgs[" << idx << "] not tb_online type." << endl;
                    return -1;
                }
    
                cout << "---------- receive a response----------:" << endl;
                cout << "openid=" << t->openid() << endl;
                cout << "tconndid=" << t->tconndid() << endl;
                cout << "timekey=" << t->timekey() << endl;
                cout << "gamesvrid=" << t->gamesvrid() << endl;
                cout << "logintime=" << t->logintime() << endl;
                for (int32_t i = 0; i < t->lockid_size();i++)
                {
                    cout << "lockid[" << i << "]=" << t->lockid(i) << endl;
                }
                tb_online_pay_info pay = t->pay();
                cout << "pay total_money=" << pay.total_money() << "; pay_times=" << pay.pay_times() << endl;
    
                //获取记录的版本号
                std::string version;
                int iRet = g_stAsyncApi.GetMessageOption(*t, NS_TCAPLUS_PROTOBUF_API::MESSAGE_OPTION_DATA_VERSION, &version);
                cout << "after GetMessageOption iRet= [" << iRet << "] version:" << version.c_str() << " msg:" << t << endl;
            }
    
            return 0;
        }
    
        //收到错误响应消息的回调
        int OnError(const std::vector< ::google::protobuf::Message *> &msgs, int errorcode)
        {
            cout << "OnError[" << msgs.size() << endl;
            g_dwTotalRevNum++;
            for (size_t idx = 0; idx < msgs.size(); idx++)
            {
                tb_online* t = dynamic_cast<tb_online *>(msgs[idx]);
                if (NULL == t)
                {
                    cout << "ERROR: msgs[" << idx << "] not tb_online type." << endl;
                    return -1;
                }
    
                if (TcapErrCode::TXHDB_ERR_RECORD_NOT_EXIST == errorcode)
                {
                    cout << "ERROR: openid= " << t->openid() << ", tconndid= " << t->tconndid() << ", timekey= " << t->timekey() << ", record not exists" << endl;
                }
                cout << "ERROR: openid = [" << t->openid() << "], tconndid = [" << t->tconndid() << "], timekey =[" << t->timekey() << "] failed:%d"  << errorcode << endl;
            }
    
            return 0;
        }
    
        //消息超时的回调
        int OnTimeout(const std::vector< ::google::protobuf::Message *> &msgs)
        {
            cout << "OnTimeout[" << msgs.size() << endl;
            for (size_t idx = 0; idx < msgs.size(); idx++)
            {
                tb_online* t = dynamic_cast<tb_online *>(msgs[idx]);
                if (NULL == t)
                {
                    cout << "TIMEOUT: msgs[" << idx << "] not tb_online type!" << endl;
                    return -1;
                }
    
                cout << "TIMEOUT: openid = [" << t->openid() << "], tconndid = [" << t->tconndid() << "], timekey =[" << t->timekey() << "] timeout" << endl;
            }
    
            return 0;
        }
    
        int OnFinish(const NS_TCAPLUS_PROTOBUF_API::MsgParam &param)
        {
            cout << "OnFinish: " << param.m_nOperation << " req: " << param.m_vecMsgs.size()<< endl;
            return 0;
        }
    };

    步骤4:发送 set 请求

    int SendSetRequest()
    {
        //定义 PB 记录的结构体并赋值,结构体通过 proto 转换
        static tb_online t;
        t.set_openid(2);
        t.set_tconndid(2);
        t.set_timekey("test_tcaplus_2");
        t.set_gamesvrid("MyValueStr_2");
        t.set_logintime(333);
        for (int32_t i = 0; i < 3;i++)
        {
            t.add_lockid(i+1);
        }
    
        tb_online_pay_info* pay = new tb_online_pay_info();
        pay->set_total_money(1024);
        pay->set_pay_times(1);
        t.set_allocated_pay(pay);
    
        cout << "INIT: openid= " << t.openid() << ", tconndid= " << t.tconndid() << ", timekey= " << t.timekey() << endl;
    
        //设置版本号,用于乐观锁
        std::string version = "-1"; // std::string version="1"; -1表示不比较,1表示服务器数据version为1
        g_stAsyncApi.SetMessageOption(t, NS_TCAPLUS_PROTOBUF_API::MESSAGE_OPTION_DATA_VERSION, version);
    
        //传入定义的回调,收到响应消息后自动调用回调函数
        static CommonCallback cb;
        int32_t iRet = g_stAsyncApi.Set(&t, &cb);
        if (iRet != TcapErrCode::GEN_ERR_SUC)
        {
            cout << "ERROR: openid= " << t.openid() << ", tconndid= " << t.tconndid() << ", timekey= " << t.timekey() << ", Set Error iRet = " << iRet << endl;
            return -1;
        }
        return 0;
    }

    示例

    int main(void) {
    
        //初始化 API 客户端
        int ret = InitAsyncPbApi();
        if ( ret != 0)
        {
            printf("InitAsyncPbApi failed\n");
            return -1;
        }
    
        //发送请求
        ret = SendSetRequest();
        if (0 != ret)
        {
            printf("SendSetRequest failed\n");
            return -1;
        }
    
        //接收响应
        do
        {
            // 更新,接收回包
            g_stAsyncApi.UpdateNetwork();
            usleep(1000 * 10);
        } while (g_dwTotalRevNum != 1);
        return 0;
    }
    联系我们

    联系我们,为您的业务提供专属服务。

    技术支持

    如果你想寻求进一步的帮助,通过工单与我们进行联络。我们提供7x24的工单服务。

    7x24 电话支持