当前位置: 首页 > news >正文

【RabbitMQ 项目】服务端:数据管理模块之虚拟机模块

文章目录

  • 一.编写思路
  • 二.代码实践

一.编写思路

前置说明:
该项目是 RabbitMQ 项目的简化版,服务器上只会有一个虚拟机,所以虚拟机模块就是最终的数据模块,并且只需定义虚拟机类,无需虚拟机管理类

成员变量:

  1. 交换机管理句柄
  2. 消息队列管理句柄
  3. 绑定管理句柄
  4. 消息管理句柄
    句柄建议使用智能指针,防止将来虚拟机定义在栈上,给栈带来不小的负担
    成员方法
  5. 声明交换机
  6. 删除交换机
    与之相关的绑定也要随之删除
  7. 声明队列
    同时要调用消息管理句柄中的接口,初始化队列消息管理句柄
  8. 删除队列
    与之相关的绑定也要随之删除,同时删除队列消息
  9. 绑定交换机和队列
  10. 解绑交换机和队列
  11. 向某个队列发布消息
  12. 从某个队列消费消息
  13. 确认应答指定队列的指定消息
  14. 获取指定交换机相关的所有绑定:给服务器模块用的,用于路由交换

二.代码实践

#pragma once
#include "Exchange.hpp"
#include "MsgQueue.hpp"
#include "Binding.hpp"
#include "Message.hpp"
#include "../common/Log.hpp"
#include <memory>
namespace ns_data
{using ExchangeManagerPtr = std::shared_ptr<ExchangeManager>;using MsgQueueManagerPtr = std::shared_ptr<MsgQueueManager>;using BindingManagerPtr = std::shared_ptr<BindingManager>;using MessageManagerPtr = std::shared_ptr<MessageManager>;class VirtualHost{private:ExchangeManagerPtr _exchangeManagerPtr;MsgQueueManagerPtr _msgQueueManagerPtr;BindingManagerPtr _bindingManagerPtr;MessageManagerPtr _messageManagerPtr;public:VirtualHost(const std::string &dbName, const std::string &baseDir): _exchangeManagerPtr(std::make_shared<ExchangeManager>(dbName)),_msgQueueManagerPtr(std::make_shared<MsgQueueManager>(dbName)),_bindingManagerPtr(std::make_shared<BindingManager>(dbName)){std::vector<std::string> qnames;_msgQueueManagerPtr->getAllQueueName(&qnames);_messageManagerPtr = std::make_shared<MessageManager>(baseDir, qnames);}/*********** 声明交换机* *****************/bool declareExchange(const std::string &name, ExchangeType type, bool isDurable){return _exchangeManagerPtr->declareExechange(name, type, isDurable);}/**************** 删除交换机* 交换机删除,与之相关的绑定也要删除* *************/void deleteExchange(const std::string &name){_exchangeManagerPtr->removeExchange(name);_bindingManagerPtr->removeExchangeBindings(name);}/************ 声明队列* 新增一个队列,消息管理句柄中也要新增一个队列消息管理句柄* ****************/bool declareMsgQueue(const std::string &name, bool isDurable){_messageManagerPtr->initQueueMessageManager(name);return _msgQueueManagerPtr->declareMsgQueue(name, isDurable);}/************* 删除队列* 删除一个队列,与之相关的绑定也要随之删除* 同时要移除与之对应的队列消息* **********/void deleteMsgQueue(const std::string &name){_bindingManagerPtr->removeMsqQueueBindings(name);_messageManagerPtr->removeQueueMessages(name);_msgQueueManagerPtr->removeMsgQueue(name);}/**************** 绑定交换机和队列* ***********/bool bind(const std::string &ename, const std::string &qname, const std::string& bindingKey){//内部判断绑定是否需要持久化bool isDurable = false;if (_msgQueueManagerPtr->getMsgQueue(qname)->_isDurable && _exchangeManagerPtr->getExchange(ename)){isDurable = true;}return _bindingManagerPtr->bind(ename, qname, bindingKey, isDurable);}/************** 解绑交换机和队列* *************/void unbind(const std::string &ename, const std::string &qname){            auto exchanePtr = _exchangeManagerPtr->getExchange(ename);if (exchanePtr == nullptr){return;}auto msgQueuePtr = _msgQueueManagerPtr->getMsgQueue(qname);if (msgQueuePtr == nullptr){return;}bool isDurable = false;if (msgQueuePtr->_isDurable && exchanePtr->_isDurable){isDurable = true;}_bindingManagerPtr->unbind(ename, qname, isDurable);}/*********** 向指定队列发布一条消息* ***************/bool publish(const std::string &qname, const std::string &id, const std::string &routingKey,const std::string &body, DeliveryMode deliveryMode){return _messageManagerPtr->insertMessage(qname, id, routingKey, body, deliveryMode);}/************** 从指定队列消费一条消息* *************/MessagePtr consume(const std::string& qname){return _messageManagerPtr->popFront(qname);}/**************** 应答指定队列的指定消息* **************/void ack(const std::string& qname, const std::string& msgId){_messageManagerPtr->ack(qname, msgId);}/************* 获取与指定交换机相关的所有绑定* *mapPtr:key->队列名, value->BindingPtr* ****************/bool getExchangeBindings(const std::string& ename, std::unordered_map<std::string, BindingPtr>* mapPtr){return _bindingManagerPtr->getExchangeBindings(ename, mapPtr);}};
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • XWiki中添加 html 二次编辑失效
  • 4.qml单例模式
  • Windows系统通过部署wsl + Goland进行跨平台开发
  • 劳特巴赫ICD调试器CMM调用烧录框架固件研究之C语言版本
  • Android 中使用高德地图实现根据经纬度信息画出轨迹、设置缩放倍数并定位到轨迹路线的方法
  • 浅谈人工智能之基于HTTP方式调用本地QWen OPenAI接口(Java版)
  • Qt_按钮类控件
  • 今日leetcode 349.两个数组的交集
  • Qt 类型选择器和类选择器的区别
  • C++学习笔记(30)
  • 【网络】传输层协议TCP
  • SpringBoot+thymeleaf竞赛报名系统
  • 解决【WVP服务+ZLMediaKit媒体服务】加入海康摄像头后,能发现设备,播放/点播失败,提示推流超时!
  • [机器学习]决策树
  • 24年蓝桥杯及攻防世界赛题-MISC-3
  • 【干货分享】SpringCloud微服务架构分布式组件如何共享session对象
  • 78. Subsets
  • bearychat的java client
  • javascript面向对象之创建对象
  • mysql中InnoDB引擎中页的概念
  • PHP CLI应用的调试原理
  • vue-router 实现分析
  • windows-nginx-https-本地配置
  • 浮现式设计
  • 聊聊spring cloud的LoadBalancerAutoConfiguration
  • 前端每日实战 2018 年 7 月份项目汇总(共 29 个项目)
  • 前端每日实战:61# 视频演示如何用纯 CSS 创作一只咖啡壶
  • 数据科学 第 3 章 11 字符串处理
  • 小李飞刀:SQL题目刷起来!
  • 用Visual Studio开发以太坊智能合约
  • Spring Batch JSON 支持
  • 关于Kubernetes Dashboard漏洞CVE-2018-18264的修复公告
  • ​学习一下,什么是预包装食品?​
  • ​用户画像从0到100的构建思路
  • # include “ “ 和 # include < >两者的区别
  • #define MODIFY_REG(REG, CLEARMASK, SETMASK)
  • #pragma data_seg 共享数据区(转)
  • #WEB前端(HTML属性)
  • ()、[]、{}、(())、[[]]命令替换
  • (2)从源码角度聊聊Jetpack Navigator的工作流程
  • (LLM) 很笨
  • (NSDate) 时间 (time )比较
  • (定时器/计数器)中断系统(详解与使用)
  • (附源码)基于ssm的模具配件账单管理系统 毕业设计 081848
  • (规划)24届春招和25届暑假实习路线准备规划
  • (三)Honghu Cloud云架构一定时调度平台
  • (十六)一篇文章学会Java的常用API
  • (一) springboot详细介绍
  • (一)C语言之入门:使用Visual Studio Community 2022运行hello world
  • (转)winform之ListView
  • .bat批处理(五):遍历指定目录下资源文件并更新
  • .net core 依赖注入的基本用发
  • .NET Core中如何集成RabbitMQ
  • .net redis定时_一场由fork引发的超时,让我们重新探讨了Redis的抖动问题
  • .NET Standard 的管理策略