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

【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);
        }
    };
}

http://www.kler.cn/a/316410.html

相关文章:

  • 844.比较含退格的字符串
  • 大数据新视界 -- 大数据大厂之 Impala 存储格式转换:从原理到实践,开启大数据性能优化星际之旅(下)(20/30)
  • vue请求数据报错,设置支持跨域请求,以及2种请求方法axios或者async与await
  • Mac intel 安装IDEA激活时遇到问题 jetbrains.vmoptions.plist: Permission denied
  • 山泽光纤HDMI线:铜线的隐藏力量
  • 什么时候需要复写hashcode()和compartTo方法
  • Maven进阶-二、依赖
  • 面试金典题2.4
  • Rust 文件与 IO
  • 【网络】TCP/IP 五层网络模型:数据链路层
  • 苍穹外卖学习笔记(五)
  • 高级java每日一道面试题-2024年9月19日-框架篇[Mybatis篇]-说一下mybatis的一级缓存和二级缓存?
  • Android对象池的深入理解和使用
  • 7.搭建个人金融数据库之快速获取股票列表和基本信息!
  • PowerShell install 一键部署Oracle12c
  • Guava中Preconditions校验
  • 数据安全治理
  • JVM 字节码与 JIT 编译详解
  • 云原生信息安全:筑牢数字化时代的安全防线
  • Vue3:mitt实现组件通信
  • Three.js 3D人物漫游项目(下)
  • 统信服务器操作系统a版e版【dde桌面限制登录次数】介绍
  • 大数据处理技术:HBase的安装与基本操作
  • python画正方形、平行四边形、六边形、五角星、风车(四个半圆)
  • ansible远程自动化运维、常用模块详解
  • SpringSecurity -- 入门使用