rabbitMq-----broker服务器

news/2024/10/3 12:06:23 标签: 服务器, rabbitmq, 前端

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

文章目录

  • 前言
  • 管理的字段


前言

搭建一个网络服务器,在内部提供各个业务接口即可。
在业务处理函数中,每次请求过来找到对应的信道,通过信道句柄调用前边封装好的处理接口进行处理,最后返回响应即可。


管理的字段

服务器需要管理的字段,其中需要搭建一个tcp服务器。然后就是我们业务所需的句柄,一个是虚拟机管理句柄,消费者管理句柄,连接管理句柄和线程池句柄。

 class Server
{
private:
 using MessagePtr = std::shared_ptr<google::protobuf::Message>;
    muduo::net::TcpServer _server;
    muduo::net::EventLoop _baseloop;
    ProtobufCodecPtr _codec;        // 协议处理器 对收到的请求进行protobuf协议处理
    ProtobufDispatcher _dispatcher; // 请求分发器
    VirtualHost::ptr _host;
    ConsumerManager::ptr _consumer_manager;
    ConnectionManager::ptr _connection_manager;
    ThreadPool::ptr _pool;
}

我们需要为服务器注册业务请求处理函数。muduo库是支持protobuf协议的处理的。

// 注册请求处理函数
_dispatcher.registerMessageCallback<openChannelRequest>(std::bind(&Server::OnOpenChannel,this,std::placeholders::_1,std::placeholders::_2,std::placeholders::_3));
_dispatcher.registerMessageCallback<closeChannelRequest>(std::bind(&Server::OnClodeChannle,this,std::placeholders::_1,std::placeholders::_2,std::placeholders::_3));
_dispatcher.registerMessageCallback<declareExchangeRequest>(std::bind(&Server::OnDeclareExchange,this,std::placeholders::_1,std::placeholders::_2,std::placeholders::_3));
_dispatcher.registerMessageCallback<deleteExchangeRequest>(std::bind(&Server::OnDeleteExchange,this,std::placeholders::_1,std::placeholders::_2,std::placeholders::_3));
_dispatcher.registerMessageCallback<declareQueueRequest>(std::bind(&Server::OnDeclareQueue,this,std::placeholders::_1,std::placeholders::_2,std::placeholders::_3));
_dispatcher.registerMessageCallback<deleteQueueRequest>(std::bind(&Server::OnDeleteQueue,this,std::placeholders::_1,std::placeholders::_2,std::placeholders::_3));
_dispatcher.registerMessageCallback<queueBindRequest>(std::bind(&Server::onQueueBind,this,std::placeholders::_1,std::placeholders::_2,std::placeholders::_3));
_dispatcher.registerMessageCallback<queueUnBindRequest>(std::bind(&Server::onQueueUnBind,this,std::placeholders::_1,std::placeholders::_2,std::placeholders::_3));
_dispatcher.registerMessageCallback<basicPublishRequest>(std::bind(&Server::onBasicPublish,this,std::placeholders::_1,std::placeholders::_2,std::placeholders::_3));
_dispatcher.registerMessageCallback<basicAckRequest>(std::bind(&Server::onBasicAck,this,std::placeholders::_1,std::placeholders::_2,std::placeholders::_3));
_dispatcher.registerMessageCallback<basicConsumeRequest>(std::bind(&Server::onBasicConsume,this,std::placeholders::_1,std::placeholders::_2,std::placeholders::_3));
_dispatcher.registerMessageCallback<basicCancelRequest>(std::bind(&Server::onBasicCancel,this,std::placeholders::_1,std::placeholders::_2,std::placeholders::_3));
        }

当新连接建立时,我们需调用连接句柄创建一个新连接。
而连接断开时,需要删除连接对象。

void onConnection(const muduo::net::TcpConnectionPtr &conn)
 {
     if (conn->connected() == true)
     {
         LOG_INFO << "新连接建立了";
         _connection_manager->newConnection(_host,_consumer_manager,_codec,conn,_pool);
     }
     else
     {
         LOG_INFO << "连接断开了";
         _connection_manager->delConnection(conn);
     }
 }

而其他注册的业务处理函数也比较简答,大体流程就是通过连接找到对应的连接管理对象,然后通过请求中的rid字段找道连接管理中的对应信道。调用信道中封装好的处理接口进行处理即可。

void OnDeclareExchange(const muduo::net::TcpConnectionPtr &conn,const declareExchangeRequestPtr &message,muduo::Timestamp){
           Connection::ptr mconn =  _connection_manager->getConnection(conn);
 if(mconn.get() == nullptr)
  {
      DLOG("声明交换机时,没有找到连接对应的Connection对象!");
      conn->shutdown();
      return;
  }

  Channel::ptr cp = mconn->getChannel(message->cid());
  if(cp.get() == nullptr)
  {
      DLOG("声明交换机时,没有找到信道!");
      conn->shutdown();
      return;
  }

  return cp->declareExchange(message);
}

这里有两个比较特殊,一个打开信道,一个是关闭信道
这两个操作是通过连接找到连接管理对象,然后调用连接管理对象提供的打开信道和关闭信道操作进行处理。

void OnOpenChannel(const muduo::net::TcpConnectionPtr &conn,const openChannelRequestPtr &message,muduo::Timestamp){
            Connection::ptr mconn = _connection_manager->getConnection(conn);
 if(mconn.get() == nullptr)
 {
     DLOG("打开信道时,没有找到连接对应的Connection对象!");
     conn->shutdown();
     return;
 }

 return mconn->openChannel(message);
}
//关闭信道
void OnClodeChannle(const muduo::net::TcpConnectionPtr &conn,const closeChannelRequestPtr &message,muduo::Timestamp){
 Connection::ptr mconn = _connection_manager->getConnection(conn);
 if(mconn.get() == nullptr)
 {
     DLOG("关闭信道时,没有找到连接对应的Connection对象!");
     conn->shutdown();
     return;
 }

 return mconn->closeChannel(message);
}

在构造函数的时候,由于队列消费者是以队列为单位管理的,所以我们要获取已经存在的队列,来进行队列消费者的初始化。

//消费者是按照队列为单元进行管理的,针对历史消息中的所有队列,需要初始化队列的消费者管理结构QueueConsumer
 std::unordered_map<std::string, mq::MsgQueue::ptr> mqmp =  _host->allQueue();
 for(auto &mq : mqmp)
 {
     _consumer_manager->initQueueConsumer(mq.first);
 }

http://www.niftyadmin.cn/n/5688330.html

相关文章

HTML+CSS 基础第三季课堂笔记

一、CSS基础概念 CSS有两个重要的概念&#xff0c;分别是样式和布局 CSS的样式分为两种&#xff0c;一种是文字的样式&#xff0c;一种是盒模型的样式 CSS的另一个重要的特性就是辅助页面布局&#xff0c;完成HTML不能完成的功能&#xff0c;比如并排显示&#xff0c;比如精…

Linux ssh 免密登录配置

参考资料 ~/.ssh/configについて~/.ssh/configを使ってSSH接続を楽にする.ssh/configファイルでSSH接続を管理する 目录 一. 密钥生成1.1 生成工具1.1.1 OpenSSH1.1.2 Git 1.2 生成命令1.3 注意事项1.4 解决路径中的用户名乱码 二. 将公钥配置到目标服务&#xff0c;免密登录2…

中国身份证号码校验

题目描述 第二届河南省最美教师评选开始了&#xff0c;每一位同学都可以投票选出你支持的人选&#xff0c;但是为了防止刷票&#xff0c;必须通过身份验证才可投票。负责投票平台后台的老大爷希望你能帮他验证身份证号的合法性&#xff0c;防止那些熊孩子随意刷票&#xff0c;…

Elasticsearch基础_5.ES聚合功能

文章目录 一、数据聚合1.1、桶聚合1.1.1、单维度桶聚合1.1.2、聚合结果排序1.1.3、限定聚合范围 本文只记录ES聚合基本用法&#xff0c;后续有更复杂的需求可以查看相关书籍&#xff0c;如《Elasticsearch搜索引擎构建入门与实战》 一、数据聚合 聚合可以让我们极其方便的实现…

双大马士革工艺与单大马士革有什么区别?

知识星球里的学员问&#xff1a;铜互联中的大马士革工艺有几种&#xff1f;一直分不清&#xff0c;可以讲解下吗&#xff1f; 大马士革工艺用在哪里&#xff1f; 大马士革工艺&#xff08;Damascene Process&#xff09;&#xff0c;使铜作为互连材料成为可能。铜相较于铝具有更…

如何判断一个元素在可视区域内(内含案例)

判断一个元素是否在可视区域中&#xff0c;可以使用JavaScript的 IntersectionObserver 或 getBoundingClientRect 方法。以下是两种常见的方式&#xff1a; 1. 使用 getBoundingClientRect() 方法 getBoundingClientRect() 返回元素相对于视口的大小和位置&#xff0c;然后通…

css3-----2D转换、动画

2D 转换&#xff08;transform&#xff09; 转换&#xff08;transform&#xff09;是CSS3中具有颠覆性的特征之一&#xff0c;可以实现元素的位移、旋转、缩放等效果 移动&#xff1a;translate旋转&#xff1a;rotate缩放&#xff1a;scale 二维坐标系 2D 转换之移动 trans…

开源模型应用落地-模型微调-语料采集-数据格式化(四)

一、前言 在自然语言处理(NLP)的快速发展中,语料采集作为基础性的步骤显得尤为重要。它不仅为机器学习模型提供了所需的训练数据,还直接影响模型的性能和泛化能力。随着数据驱动技术的不断进步,如何有效并高效地收集、清洗和整理丰富多样的语料,已成为研究者和工程师们亟…