rabbitMq------毗连受理模块

打印 上一主题 下一主题

主题 793|帖子 793|积分 2379

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

前言

我们的网络通信框架使用的muduo库,而在mudu库中是已经有了毗连的概念,但是我们呢还有一个信道的概念muduo库是没有的。实在muduo库是有一个channel的概念的,只不外这个概念和我们这里的channel不一样。
这也就是我们要封装这个模块的意义。

管理的字段

有一个信道内存管理句柄,因为一个毗连上可以有多个信道。
  1. class Connection
  2.     {
  3.     private:
  4.         muduo::net::TcpConnectionPtr _conn;
  5.         ProtobufCodecPtr _codec;
  6.         VirtualHost::ptr _host;
  7.         ConsumerManager::ptr _cmp;
  8.         ThreadPool::ptr _pool;
  9.         ChannelManager::ptr _channels;
  10.   }
复制代码
提供了三个操作分别是的打开信道,关闭信道和获取指定信道。
就是调用信道内存管理句柄进行操作。
打开信道和关闭都是必要给客户端返回响应的。
  1. void openChannel(const openChannelRequestPtr &req){
  2.             bool ret = _channels->openChannel(req->cid(),_host,_cmp,_codec,_conn,_pool);
  3.     if(ret == false)
  4.     {
  5.         return basicResponse(false,req->rid(),req->cid());
  6.     }
  7.     return basicResponse(true,req->rid(),req->cid());
  8. }
  9. void closeChannel(const closeChannelRequestPtr &req){
  10.     _channels->closeChannel(req->cid());
  11.     return basicResponse(true, req->rid(), req->cid());
  12. }
  13. Channel::ptr getChannel(const std::string &cid){
  14.     return _channels->getChannel(cid);
  15. }
复制代码
毗连内存管理对象

服务器上可能会存在多条链接,因此我们也必要把毗连受理起来
通过一个哈希表,建立tcp毗连和毗连受理对象的映射。
  1. class ConnectionManager
  2.     {
  3.     private:
  4.         std::mutex _mutex;
  5.         std::unordered_map<muduo::net::TcpConnectionPtr,Connection::ptr> _conns;
  6.    }
复制代码
提供三个操作,新建毗连。关闭毗连和获取指定毗连。
在服务器中就必要管理这个句柄,就可以管理所有的channel了。
  1. void newConnection(const VirtualHost::ptr &host,
  2.                     const ConsumerManager::ptr &cmp,
  3.                     const ProtobufCodecPtr &codec,
  4.                     const muduo::net::TcpConnectionPtr &conn,
  5.                     const ThreadPool::ptr &pool){
  6.      std::unique_lock<std::mutex> lock(_mutex);
  7.      auto it = _conns.find(conn);
  8.      if (it != _conns.end()) {
  9.          return ;
  10.      }
  11.      Connection::ptr self_conn = std::make_shared<Connection>(host,cmp, codec, conn, pool);
  12.      _conns.insert(std::make_pair(conn, self_conn));   
  13. }
  14. void delConnection(const muduo::net::TcpConnectionPtr &conn){
  15.      std::unique_lock<std::mutex> lock(_mutex);
  16.      _conns.erase(conn);
  17. }
  18. Connection::ptr getConnection(const muduo::net::TcpConnectionPtr &conn){
  19.      std::unique_lock<std::mutex> lock(_mutex);
  20.      auto it = _conns.find(conn);
  21.      if (it == _conns.end()) {
  22.          return Connection::ptr();
  23.      }
  24.      return it->second;
  25. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

温锦文欧普厨电及净水器总代理

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表