rabbitMq------连接管理模块

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录


前言

我们的网络通信框架使用的muduo库,而在mudu库中是已经有了连接的概念,但是我们呢还有一个信道的概念muduo库是没有的。其实muduo库是有一个channel的概念的,只不过这个概念和我们这里的channel不一样。

这也就是我们要封装这个模块的意义。


管理的字段

有一个信道内存管理句柄,因为一个连接上可以有多个信道。

cpp 复制代码
 class Connection
    {
    private:
        muduo::net::TcpConnectionPtr _conn;
        ProtobufCodecPtr _codec;
        VirtualHost::ptr _host;
        ConsumerManager::ptr _cmp;
        ThreadPool::ptr _pool;
        ChannelManager::ptr _channels;
  }

提供了三个操作分别是的打开信道,关闭信道和获取指定信道。

就是调用信道内存管理句柄进行操作。

打开信道和关闭都是需要给客户端返回响应的。

cpp 复制代码
 void openChannel(const openChannelRequestPtr &req){
            bool ret = _channels->openChannel(req->cid(),_host,_cmp,_codec,_conn,_pool);
    if(ret == false)
    {
        return basicResponse(false,req->rid(),req->cid());
    }
    return basicResponse(true,req->rid(),req->cid());
}


void closeChannel(const closeChannelRequestPtr &req){
    _channels->closeChannel(req->cid());
    return basicResponse(true, req->rid(), req->cid());
}

Channel::ptr getChannel(const std::string &cid){
    return _channels->getChannel(cid);
}

连接内存管理对象

服务器上可能会存在多条链接,因此我们也需要把连接管理起来

通过一个哈希表,建立tcp连接和连接管理对象的映射。

cpp 复制代码
class ConnectionManager
    {
    private:
        std::mutex _mutex;
        std::unordered_map<muduo::net::TcpConnectionPtr,Connection::ptr> _conns;
   }

提供三个操作,新建连接。关闭连接和获取指定连接。

在服务器中就需要管理这个句柄,就可以管理所有的channel了。

cpp 复制代码
void newConnection(const VirtualHost::ptr &host,
                    const ConsumerManager::ptr &cmp,
                    const ProtobufCodecPtr &codec,
                    const muduo::net::TcpConnectionPtr &conn,
                    const ThreadPool::ptr &pool){
     std::unique_lock<std::mutex> lock(_mutex);
     auto it = _conns.find(conn);
     if (it != _conns.end()) {
         return ;
     }
     Connection::ptr self_conn = std::make_shared<Connection>(host,cmp, codec, conn, pool);
     _conns.insert(std::make_pair(conn, self_conn));   
 }


 void delConnection(const muduo::net::TcpConnectionPtr &conn){
     std::unique_lock<std::mutex> lock(_mutex);
     _conns.erase(conn);
 }



 Connection::ptr getConnection(const muduo::net::TcpConnectionPtr &conn){
     std::unique_lock<std::mutex> lock(_mutex);
     auto it = _conns.find(conn);
     if (it == _conns.end()) {
         return Connection::ptr();
     }
     return it->second;
 }
相关推荐
网络工程小王10 小时前
【HCIE-AI】12.deepspeed分布式并行训练进阶版
人工智能·pytorch·分布式·学习·昇腾·deepspeed
ACP广源盛1392462567313 小时前
国产算力互联IX8024@ACP#Kimi K3 开源后的端侧部署硬件架构分析
大数据·人工智能·分布式·单片机·嵌入式硬件
花生了什么事o14 小时前
分布式 ID 生成方案:从数据库自增到雪花算法
数据库·分布式·算法
爱吃提升1 天前
python 分布式爬虫、爬虫合规与综合实战项目
分布式·爬虫·python
ZENERGY-众壹1 天前
跨品牌逆变器升级:华为锦浪德业 API 对接的 7 个坑
分布式·华为·数据归一化·光伏运维·逆变器api
薛定谔的猫19821 天前
LLaMA-Factory +DeepSpeed 分布式多卡训练实战全解
分布式·deepspeed·zero·多卡训练·多卡分布式训练
稚南城才子,乌衣巷风流2 天前
RabbitMQ 消息队列:从入门到实战
分布式·rabbitmq
Database_Cool_2 天前
单机 MySQL 迁移到分布式数据库方便吗?阿里云 PolarDB-X 100% MySQL 协议兼容零改造平滑迁移
数据库·分布式·mysql
肥胖小羊2 天前
解决企业微信 AccessToken 刷新并发冲突的分布式锁机制实践
分布式·企业微信
过期动态3 天前
【LeetCode 热题 100】找到字符串中所有字母异位词
java·数据结构·算法·leetcode·职场和发展·rabbitmq