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

news2024/9/22 22:32:32

文章目录

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

一.编写思路

前置说明:
该项目是 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.coloradmin.cn/o/2156016.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【JavaEE】多线程编程引入——认识Thread类

阿华代码&#xff0c;不是逆风&#xff0c;就是我疯&#xff0c;你们的点赞收藏是我前进最大的动力&#xff01;&#xff01;希望本文内容能帮到你&#xff01; 目录 引入&#xff1a; 一&#xff1a;Thread类 1&#xff1a;Thread类可以直接调用 2&#xff1a;run方法 &a…

SpringBoot+thymeleaf竞赛报名系统

一、介绍 > 这是一个基于Spring Boot的后台管理系统。 > 使用了Mybatis Plus作为持久层框架&#xff0c;EasyExcel用于Excel操作&#xff0c;Thymeleaf作为前端模板引擎。 > 界面简洁&#xff0c;功能丰富&#xff0c;完成度比较高&#xff0c;适用于JAVA初学者作…

安国U盘量产工具系列下载地址

来源地址&#xff08;访问需要科学工具&#xff09;&#xff1a;AlcorMP (Последняя версия ALCOR U2 MP v23.08.07.00.H) – [USBDev.ru] 版本列表&#xff1a; AlcorMP&#xff08;最新版本的 ALCOR U2 MP v23.08.07.00.H&#xff09; AlcorMP是在Alcor Mic…

SpringBoot项目License证书生成与验证(TrueLicense) 【记录】

SpringBoot项目License证书生成与验证(TrueLicense) 【记录】 在非开源产品、商业软件、收费软件等系统的使用上&#xff0c;需要考虑系统的使用版权问题&#xff0c;不能随便一个人拿去在任何环境都能用。应用部署一般分为两种情况&#xff1a; 应用部署在开发者自己的云服务…

数据集-目标检测系列-火车检测数据集 train >> DataBall

数据集-目标检测系列-火车检测数据集 train >> DataBall 数据集-目标检测系列-火车检测数据集 数据量&#xff1a;1W 想要进一步了解&#xff0c;请联系 DataBall。 DataBall 助力快速掌握数据集的信息和使用方式&#xff0c;会员享有 百种数据集&#xff0c;不断增加…

跟李沐学AI:注意力机制、注意力分数

目录 不随意线索 随意线索 注意力机制 非参注意力池化层 参数化的注意力机制 注意力机制总结 注意力分数 拓展到高维度 加性模型&#xff08;Additive Attention&#xff09; 点积注意力机制&#xff08;Dot Product Attention&#xff09; 注意力分数总结 不随意线…

vscode 顶部 Command Center,minimap

目录 vscode 顶部 Command Center 设置显示步骤: minimap设置 方法一:使用设置界面 方法二:使用命令面板 方法三:编辑 settings.json 文件 左侧目录树和编辑器字体不一致: vscode 顶部 Command Center Visual Studio Code (VSCode) 中的 Command Center 是一个集中…

240912-设置WSL中的Ollama可在局域网访问

A. 最终效果 B. 设置Ollama&#xff08;前提&#xff09; sudo vim /etc/systemd/system/ollama.service[Unit] DescriptionOllama Service Afternetwork-online.target[Service] ExecStart/usr/bin/ollama serve Userollama Groupollama Restartalways RestartSec3 Environme…

Python redis 安装和使用介绍

python redis安装和使用 一、Redis 安装1.1、Windows安装 二、安装 redis 模块二、使用redis 实例1.1、简单使用1.2、连接池1.3、redis 基本命令 String1.3.1、ex - 过期时间&#xff08;秒&#xff09;1.3.2、nx - 如果设置为True&#xff0c;则只有name不存在时&#xff0c;当…

fiddler抓包08_抓Android手机请求

课程大纲 手机抓包&#xff0c;电脑端的设置和IOS端相同&#xff0c;设置一次即可&#xff0c;无需重复设置。 前提&#xff1a;电脑和手机连接同一个局域网 土小帽电脑和手机都连了自己的无线网“tuxiaomao”。 Step1. 电脑端设置 ① 打开Fiddler - 开启抓包&#xff08;F12…

django项目——图片上传到阿里云OSS对象存储

文章目录 实现图片上传到阿里云OSS对象存储1. 创建阿里云OSS对象存储2. 查询获取接口访问key和秘钥3. 安装阿里云的SDK集成到项目中使用3.1 python直接操作oss23.2 django配置自定义文件存储上传文件到oss 实现图片上传到阿里云OSS对象存储 1. 创建阿里云OSS对象存储 开发文档…

重磅!人工智能等级考试来了,考试免费,上海落户可以加分

目录 简要介绍 一、关心的问题 1. 什么是上海市高等学校信息技术水平考试&#xff1f; 2. 考试分几个级别&#xff1f;有哪些科目&#xff1f; 3. 哪些人可以进行报名&#xff1f; 4. 每名学生可以报考几个科目&#xff1f; 5. 有没有考试大纲&#xff1f; 6. 考试是否有…

[笔记]23年度展会信息— 吊钩 起升机构

1.吊钩的规格参数 5吨吊钩重26公斤 10吨64公斤。 另外一套型号&#xff0c;更轻&#xff1a; 不确定是结构设计还是用钢材质达到了减重效果。 看看重载双滑轮吊钩&#xff1a; 50吨&#xff0c;400公斤&#xff0c;只是吊钩。 然后是行车吊钩与钢丝绳的直径。这在计算空载吊…

Web Components之继承

我们在使用Web Components自定义组件的时候&#xff0c;我们需要继承HTMLElement这个浏览器内置对象&#xff0c;但是如果我要一些高级封装&#xff0c;给组件内置一些方法的话。我们就需要使用继承的方式&#xff0c;在父类中实现基本功能的封装。 1 父类的封装 以下是我的继…

一文搞懂UEFI

Hi&#xff01;早哦。今天又是宠读者的一天&#xff0c;应允聊聊UEFI。 文章目录 前言UEFI是什么&#xff1f;传统BIOSBIOS作为标准BIOS作为实现BIOS的工作原理传统BIOS的局限性传统BIOS启动过程 BIOS VS UEFIUEFI&#xff1f;UEFI概念EFI 系统分区EFI 变量EFI 的启动过程EFI 变…

【高分系列卫星简介——高分三号卫星(GF-3)】

高分三号卫星&#xff08;GF-3&#xff09; 高分三号&#xff08;GF-3&#xff09;是我国首颗高分辨率、C频段、多极化合成孔径雷达&#xff08;SAR&#xff09;卫星&#xff0c;由中国空间技术研究院北京空间飞行器总部设计部研制&#xff0c;并于2016年8月10日成功发射。该卫…

thop计算模型复杂度(params,flops)

thop安装 -pip install thop在线安装失败 -离线安装 github网址&#xff1a; pytorch-OpCounter:Count the MACs / FLOPs of your PyTorch model. - GitCode python setup.py install 测试&#xff1a; from options import config as c import os os.environ["CUD…

【Flink实战】flink消费http数据并将数组展开多行

文章目录 一. 需求描述二. 方案思路1. 解决思路2. flink json 解析2.1. 通过json path解析非array数据2.2. 通过json path解析array数据 3. CROSS JOIN逻辑 三. 方案实现1. http json数据样例2. flink sql 说明 一. 需求描述 flink消费http接口的数据&#xff0c;将json中的数…

【JavaEE初阶】多线程7(面试要点)

欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗~ 如有错误&#xff0c;欢迎指出~ 目录 常见的锁策略 乐观锁vs悲观锁 重量级锁vs轻量级锁 挂起等待锁vs自旋锁 公平锁vs非公平锁 可重入锁vs不可重入锁 读写锁 synchronized的加锁过程 锁升级的过程 偏向锁 …

博途TIA v18下载时,需要重启才能安装下载路径是灰色改不了

一、需要重启才能安装 删除下面注册表P开头的文件&#xff1a; 二、下载路径是灰色改不了 注册表HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion里找到C:\Program Files或者C:\Program Files&#xff08;x86&#xff09;&#xff0c;具体哪个看安装的时候对应…