7、Khala设备资源的申请和释放

  在实际业务中,我们每次登录后,可能需要在服务端维护一些设备相关的资源信息,而不同设备所需维护的资源信息又不尽相同。Khala提供了设备资源的维护储存功能,在此我们通过一个具体的业务中对其进行展示。

  一个用户聊天设备,用户可以新添加好友ID,也可以查询当前已经添加的所有好友ID,因此服务端应该为登录设备记录和维护当前好友id。但是在khala的默认实现中,当前好友id这种与业务紧密联系的信息显然是没有直接提供接口的。但是khala提供了一个extraContext的接口,此接口通过boost库中的any类型实现,可以借此维护不同设备资源信息。具体业务实现如下:

  我们依旧在之前实现的MyUsrType类型下进行修改。首先我们实现一个用户设备资源类UsrInfo,在这个类中,我们通过set维护好友id,并提供添加和查询好友ID的接口。在UsrInfo的析构函数中,我们通过打印日志来跟踪资源对象的生命周期。

class UsrInfo {
public:
    UsrInfo(const std::string& name) :
            name_(name) {
    }
    virtual ~UsrInfo() {
        LOG_INFO << "UsrInfo name:" << name_ << " is destructed!";
    }
    //添加一个好友的ID
    void addFriends(uint id) {
        myFriends_.insert(id);
    }
    //获取所有好友的IDs
    std::vector<uint> getAllFriends() {
        std::vector<uint> friends;
        friends.assign(myFriends_.begin(), myFriends_.end());
        return friends;
    }
    const std::string& getName() const {
        return name_;
    }
private:
    //当前用户名
    std::string name_;
    //当前用户添加的好友IDs11
    std::set<uint> myFriends_;
};

  在MyUsrType的onLoginSuccessMsg中,我们申请UsrInfo资源,并将其指针保存到infoNodePtr的ExtraContext中。在实际运用中,我们可以通过使用智能指针shared_ptr来对申请的资源UsrInfo进行管理,那ExtraContext保存的将为UsrInfo的智能指针。

bool MyUsrType::onLoginSuccessMsg(khala::InfoNodePtr& infoNodePtr,
        Json::Value& msg, khala::Timestamp time) {
    std::string name = msg[KEY_LOGIN_NAME].asString();
    //将申请的UsrInfo指针保存到ExtraContext
    infoNodePtr->setExtraContext(new UsrInfo(name));
    std::stringstream ss;
    ss << "login success! your id is:" << infoNodePtr->getId();
    infoNodePtr->send(ss.str());
    return true;
}

  我们可以给MyUsrType创建addFriend和getFriends两个消息事件,具体添加方法参见5、登录管理设备类型 + 创建新的设备类型,在这两个消息事件的实现中,我们通过ExtraContext获取UsrInfo的资源,并读写该资源信息。

bool MyUsrType::onAddFriend(khala::InfoNodePtr& infoNodePtr, Json::Value& msg,
        khala::Timestamp time) {
    uint friendId = msg[KEY_FRIEND_ID].asUInt();
    //尝试获取UsrInfo资源
    UsrInfo* usrInfo = boost::any_cast<UsrInfo*>(
            infoNodePtr->getExtraContext());
    if (usrInfo == 0)
        return false;
    //写UsrInfo资源
    usrInfo->addFriends(friendId);
    std::stringstream ss;
    ss << "add friend id:" << friendId << " success !";
    infoNodePtr->send(ss.str());
    return true;
}
bool MyUsrType::onGetFriends(khala::InfoNodePtr& infoNodePtr, Json::Value& msg,
        khala::Timestamp time) {
    //尝试获取UsrInfo资源
    UsrInfo* usrInfo = boost::any_cast<UsrInfo*>(
            infoNodePtr->getExtraContext());
    if (usrInfo == 0)
        return false;
    //读取UsrInfo资源中的信息
    std::vector<uint> friends = usrInfo->getAllFriends();
    std::stringstream ss;
    ss<<"my friends id:";
    std::vector<uint>::iterator it = friends.begin();
    for(;it!=friends.end();it++){
        ss<<*it<<" ";
    }
    infoNodePtr->send(ss.str());
    return true;
}

  因为UsrInfo资源是我们在维护MyUsrType类型的设备的生命周期中申请的资源,因此当该设备退出生命周期将要结束时,我们必须将申请的UsrInfo资源释放。设备资源的释放工作在releaseConnNode中进行。

void MyUsrType::releaseConnNode(khala::InfoNodePtr& infoNodePtr,
        khala::Timestamp time) {
    UsrInfo* usrInfo = boost::any_cast<UsrInfo*>(
                infoNodePtr->getExtraContext());
    if (usrInfo != 0){
        //释放设备申请的资源
        delete usrInfo;
        usrInfo = 0;
    }
}

  我们通过客户端程序(./example/testClient/HelloKhalaClient3.py)对其进行测试。首先选择UsrType类型进行登录操作。

  然后我们添加一个friend,id为100,然后再查询所有friend的id,显示只有100一个id。

  我们再为这个用户添加一个friend,id为200,然后再通过getFriends进行查询,这时显示存在100和200两个id了。

  最后我们选择退出,并查看日志,看是否我们申请的资源能否随着设备账号的退出而成功释放。通过日志显示,我们这个账号名为moss1的设备申请的UsrInfo资源随着设备生命周期的结束而成功释放了。

  通过以上实例,我们实现了MyUsrType类型设备对UsrInfo资源的申请管理和释放。Khala用户可以根据实际业务需求来为不同设备申请和管理相应的设备资源。

时间: 2024-10-19 21:36:52

7、Khala设备资源的申请和释放的相关文章

Apache Spark源码走读之19 -- standalone cluster模式下资源的申请与释放

欢迎转载,转载请注明出处,徽沪一郎. 概要 本文主要讲述在standalone cluster部署模式下,Spark Application在整个运行期间,资源(主要是cpu core和内存)的申请与释放. 构成Standalone cluster部署模式的四大组成部件如下图所示,分别为Master, worker, executor和driver,它们各自运行于独立的JVM进程. 从资源管理的角度来说 Master  掌管整个cluster的资源,主要是指cpu core和memory,但Ma

C语言动态内存的申请和释放

什么是动态内存的申请和释放? 当程序运行到需要一个动态分配的变量时,必须向系统申请取得堆中的一块所需大小的存储空间,用于存储该变量.当不再使用该变量时,也就是它的生命结束时,要显式释放它所占用的存储空间,这样系统就能对该堆空间进行再次分配,做到重复使用有限的资源. 下面将介绍动态内存申请和释放的函数 1.malloc函数 在C语言中,使用malloc函数来申请内存.函数原型如下: #include<stdlib.h> void *malloc(size_t size); 参数size代表需要动

Unity内存申请和释放

转自:http://www.jianshu.com/p/b37ee8cea04c 1.资源类型 GameObject, Transform, Mesh, Texture, Material, Shader, Script和各种其他Assets. 2.资源创建方式 静态引用,在脚本中加一个public GameObject变量,在Inspector面板中拖一个prefab到该变量上,然后在需要引用的地方Instantiate: Resource.Load,资源需要放在Assets/Resource

【小松教你手游开发】【unity实用技能】Unity内存申请和释放(转自tnqiang)

这里先声明转自http://www.jianshu.com/p/b37ee8cea04c 1.资源类型 GameObject, Transform, Mesh, Texture, Material, Shader, Script和各种其他Assets. 2.资源创建方式 静态引用,在脚本中加一个public GameObject变量,在Inspector面板中拖一个prefab到该变量上,然后在需要引用的地方Instantiate: Resource.Load,资源需要放在Assets/Reso

内存申请和释放及堆连续

glibc 内存申请和释放及堆连续检查 C语言有两种内存申请方式: 1.静态申请:当你声明全局或静态变量的时候,会用到静态申请内存.静态申请的内存有固定的空间大小.空间只在程序开始的时候申请一次,并且不再释放(除非程序结束). 2.自动申请:当你声明自动变量的时候会使用自动申请.函数参数.局部变量都属于自动变量.这些变量空间在程序执行致相关语句块申请,离开语句块时释放. 还有一种内存申请方式:动态内存申请.C语言变量并不支持动态内存申请,这一功能由库函数实现.C里面没有动态这个存储类型!! 当你

[CareerCup] 13.9 Aligned Malloc and Free Function 写一对申请和释放内存函数

13.9 Write an aligned malloc and free function that supports allocating memory such that the memory address returned is divisible by a specific power of two. EXAMPLE align_malloc (1000,128) will return a memory address that is a multiple of 128 and t

(版本定制)第17课:Spark Streaming资源动态申请和动态控制消费速率原理剖析

本期内容: 1.Spark Streaming资源动态分配 2.Spark Streaming动态控制消费速率 为什么需要动态? a)Spark默认情况下粗粒度的,先分配好资源再计算.对于Spark Streaming而言有高峰值和低峰值,但是他们需要的资源是不一样的,如果按照高峰值的角度的话,就会有大量的资源浪费. b) Spark Streaming不断的运行,对资源消耗和管理也是我们要考虑的因素. Spark Streaming资源动态调整的时候会面临挑战: Spark Streaming

设备资源管理系统-角色管理

设备资源管理系统-角色管理 用户.角色.权限关系 权限: a:仪器设备管理 b:设备校准检修 c:设备购置计划 d: e: . .   . 角色与权限: 系统管理员: a;b;c;d;e;f;g;h;i;j;k; 高级管理员: a;b;c;d;e;i;j;k; 业务用户: a;b;f;g;h;i; 结论: 1.用户与角色是多对多的关系 2.权限与角色是多对多的关系 3.角色在三者之间的关系中起到承上启下的作用 数据库设计 用户表: 用户ID                         用户姓

第17课:Spark Streaming资源动态申请和动态控制消费速率原理剖析

本期内容: Spark Streaming资源动态分配 Spark Streaming动态控制消费速率 为什么需要动态? Spark默认情况下粗粒度的,先分配好资源再计算.而Spark Streaming有高峰值和低峰值,但是他们需要的资源是不一样的,如果按照高峰值的角度的话,就会有大量的资源浪费. Spark Streaming不断的运行,对资源消耗和管理也是我们要考虑的因素. Spark Streaming资源动态调整的时候会面临挑战: Spark Streaming是按照Batch Dur