文章目录
 
  
 
 
一.编写思路
 
 
 
二.代码实践
 
#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);
        }
        
        bool getExchangeBindings(const std::string& ename, std::unordered_map<std::string, BindingPtr>* mapPtr)
        {
            return _bindingManagerPtr->getExchangeBindings(ename, mapPtr);
        }
    };
}