rabbitMq------虚拟机管理模块

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

文章目录


前言

虚拟机管理模块就是对交换机/队列/绑定/消息管理的一个整合,因为这几个模块他们存在一个这关联关系,而这几个模块又是独立的。所以我们将他们整合在一起,提供一个统一的操作。


管理的对象

需要把四个数据管理的句柄保存一份。

cpp 复制代码
    class VirtualHost
    {
    private:
        std::string _host_name;     //虚拟机名称
        ExchangeManager::ptr _emp;
        MsgQueueManager::ptr _mqmp;
        BindingManager::ptr _bmp;
        MessageManager::ptr _mmp;
    }

在构造函数中构造对象。其他三个对象会在构造的时候进行数据的恢复。但是队列消息是以队列为单位进行管理的,我们需要获取已经存在的队列,来进行初始化。

cpp 复制代码
VirtualHost(const std::string &hname,const std::string &basedir,const std::string &dbfile)
  :_host_name(hname),
  _emp(std::make_shared<ExchangeManager>(dbfile)),
  _mqmp(std::make_shared<MsgQueueManager>(dbfile)),
  _bmp(std::make_shared<BindingManager>(dbfile)),
  _mmp(std::make_shared<MessageManager>(basedir)){
      //交换机,队列和绑定信息会在构造函数的时候进行数据恢复。
      //而队列消息没有在构造函数时进行数据恢复,因为我们的队列信息是按照队列为单元进行存储的,这个MessageManager是队列消息的总体管理类
      //获取当前已经存在的队列,为这些队列创建队列消息类,并进行数据恢复
      std::unordered_map<std::string,MsgQueue::ptr> qmap = _mqmp->AllQueue();
      for(auto &q : qmap){
          _mmp->InitQueueMessage(q.first);    //进行数据恢复
      }
  }

提供的操作

申明/删除交换机

删除交换机的时候也需要删除交换机的所有绑定关系

cpp 复制代码
 //交换机操作
bool declareExchange(const std::string &name,
    ExchangeType type, bool durable, bool auto_delete,
    const google::protobuf::Map<std::string, std::string> &args){
    return _emp->declareExchange(name,type,durable,auto_delete,args);
}
void deleteExchange(const std::string &name){
    //删除交换机,同时需要删除交换机的所有绑定信息
   _bmp->removeExchangeBindngs(name);
   _emp->deleteExchange(name);
}

申明/删除队列

申明队列时,需要为队列创建队列消息管理。

删除队列时需要删除队列的绑定信息和队列消息管理对象.

cpp 复制代码
bool declareQueue(const std::string &name, bool durable,
	           bool exclusive, bool auto_delete,
	           const google::protobuf::Map<std::string, std::string> &args){
	//创建队列时,需要位队列创建队列消息管理
	_mmp->InitQueueMessage(name);
	return _mqmp->declareQueue(name,durable,exclusive,auto_delete,args);
	}
	void deleteQueue(const std::string &name){
	//删除队列,同时需要删除队列所有的绑定信息和队列消息
	_bmp->removeMsgQueueBindings(name);
	_mmp->DestoryQueueMessage(name);
	_mqmp->deleteQueue(name);
	}

绑定/解除绑定

绑定关系的持久化是由交换机个队列的持久化决定的。只要当两个的持久化都为1,绑定关系的持久化标志位才为1.

cpp 复制代码
 //绑定信息的操作
        void bind(const std::string &ename, const std::string &qname, const std::string &key){
 //需要判断队列和交换机的持久化标志位
 Exchange::ptr ecp = _emp->selectExchange(ename);
 if(ecp.get() == nullptr){
     ELOG("进行队列绑定失败,交换机%s不存在",ename.c_str());
     return;
 }
 MsgQueue::ptr mqp = _mqmp->selectQueue(qname);
 if(mqp.get() == nullptr){
     ELOG("进行队列绑定失败,队列%s不存在",qname.c_str());
     return;
 }

 //交换机和队列的持久化位必须同时满足,绑定消息的数据才可以持久化
 _bmp->bind(ename,qname,key,ecp->durable && mqp->durable);
}


void unbind(const std::string &ename, const std::string &qname){
 _bmp->unbind(ename,qname);
}

发布消息

发布消息就是调用指定队列的队列消息管理对象的操作,插入一个MessagePtr到链表中,同时持久化。另外需要把队列的持久化标志传入进去,进行判断。

cpp 复制代码
//发布一条消息,只是做了一个存储
 bool basicPublish(const std::string &qname, BasicProperties *bp, std::string body){
     //需要判断队列的持久化标志位
     MsgQueue::ptr mqp = _mqmp->selectQueue(qname);
     if(mqp.get() == nullptr){
         ELOG("发布消息失败,队列%s不存在",qname.c_str());
         return false;
     }

     return _mmp->insert(qname,bp,body,mqp->durable);
 }

消费消息/消息确认

消费消息则是获取指定队列的队列消息管理对象进行操作。

消息确认类似的操作.

cpp 复制代码
//消费一条消息,只是把消息取出,由路由交换模块进行推送消息
MessagePtr basicConsume(const std::string &qname){
    return _mmp->front(qname);
}

//确认一条消息,就是做删除
void basicAck(const std::string &qname,const std::string &msg_id){
    _mmp->ack(qname,msg_id);
}
相关推荐
被摘下的星星8 分钟前
HTTP 状态码 和 网络端口号
网络·网络协议·http
云边云科技_云网融合8 分钟前
生物医疗跨院区影像与诊疗数据传输:高带宽与合规双重目标下的网络搭建指南
网络·科技
ESDWAN11 分钟前
企业组网后网络频繁掉线,常见故障排查指南
运维·网络·架构
崽崽..28 分钟前
大端存储和小端存储的区别以及与网络编程的联系
网络·大小端
迪康Defender1 小时前
终端安全实践:浅谈端点安全管理系统内置终端防火墙能力
运维·服务器·网络·经验分享·安全·php·终端安全管理
AI备忘录1 小时前
(二十二)华为华三锐捷迈普思科 802.1X 端口认证配置命令(网络准入五厂商对照)
运维·服务器·开发语言·网络·安全·华为
优化Henry1 小时前
LTE站点以太网光模块告警处理实践
运维·网络·笔记·学习·信息与通信
数字新视界1 小时前
2026机房动环监控选型指南:场景规模需求、市场发展占有率和竞争梯队报告解析
大数据·运维·网络·人工智能·嵌入式硬件·机房动环监控·机房环境安全
我们从未走散1 小时前
从内存字典到租约内核:分布式上游账号池如何做到不超卖
分布式
我不是程序员三三1 小时前
企业风控实战:文件外发控制软件如何补齐数据泄露的出口短板
网络