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

rabbitMq-----broker服务器

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

文章目录

  • 前言
  • 管理的字段


前言

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


管理的字段

服务器需要管理的字段,其中需要搭建一个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);
}

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

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

相关文章:

rabbitMq-----broker服务器

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言管理的字段 前言 搭建一个网络服务器&#xff0c;在内部提供各个业务接口即可。 在业务处理函数中&#xff0c;每次请求过来找到对应的信道&#xff0c;通过信…...

MAC备忘录空白解决方案

打开icloud->备忘录 取消勾选同步此MAC后再次勾选&#xff0c;然后点击完成即可。...

cnn突破七(四层bpnet网络公式与卷积核bpnet公式相关)

我们要有一个概念&#xff0c;就是卷积核就是我们的w1&#xff0c;w12&#xff0c;w2 那么我们的5*5卷积核怎么表达&#xff0c;当他在14*14的图像中流动时&#xff0c;对应的像素也在变化 这个和我们的上面w1&#xff0c;w12&#xff0c;w2不同&#xff0c;因为这几个都是全…...

PHP中的PEAR是什么

PHP中的PEAR是PHP Extension and Application Repository的缩写&#xff0c;即PHP扩展与应用库。它是一个PHP扩展及应用的代码仓库&#xff0c;提供了许多常用的PHP库和工具&#xff0c;涵盖了页面呈现、数据库访问、文件操作、数据结构、缓存操作、网络协议、WebService等许多…...

(C语言贪吃蛇)4.贪吃蛇地图优化及算法说明

上节代码示例&#xff1a; #include <curses.h>void initNcurse() {initscr();keypad(stdscr,1); }void gamePic() {int hang;int lie;for(hang 0;hang < 20;hang ){if(hang 0){for(lie 0;lie < 20;lie ){printw("--");}printw("\n");for(…...

国外电商系统开发-运维系统拓扑布局

点击列表中设备字段&#xff0c;然后定位到【拓扑布局】中&#xff0c;可以看到拓扑发生了变化 再回头&#xff0c;您再次添加一个服务器到系统中&#xff0c;并且选择该服务器的连接节点为您刚才创建的“SDN路由器”&#xff0c;保存后&#xff0c;您可以看到这个服务器连接着…...

使用winsock和ip相关指令重置Window网络配置

netsh winsock reset 和 netsh int ip reset 是 Windows 中用于修复网络问题的命令。它们分别用于重置 Winsock 和 TCP/IP 网络配置&#xff0c;以解决可能由于配置错误或网络堆栈损坏而导致的网络连接问题。 1. netsh winsock reset 1.1 作用 重置 Winsock 目录。Winsock 是…...

用AI做电子萌宠,快速涨粉变现

今天给大家分享一个很热门的小副业—AI宠物视频 项目介绍 前一阵刷到一个萌宠账号&#xff0c;爆款率可真高&#xff0c;涨粉可真快呀。 28篇笔记涨粉3.2万&#xff0c;点赞更是达到了十几万。其中有6篇点赞上万。 至于究竟是不是AI其实没那么重要&#xff0c;重要的是&…...

如何在 Axios 中封装事件中心EventEmitter

在 Axios 中封装一个事件中心 EventEmitter 允许你在请求的不同阶段&#xff08;如请求开始、请求成功、请求失败等&#xff09;触发事件。这可以通过创建一个自定义的 Axios 实例&#xff0c;并结合 Node.js 的 events 模块来实现。以下是一个详细的步骤指南和示例代码&#x…...

计算机网络——ftp

在网络通信中&#xff0c;控制连接和数据连接是两种不同类型的连接&#xff0c;它们各自具有特定的功能和用途。 一、控制连接 定义与功能&#xff1a; 控制连接主要用于在通信双方之间传输控制信息&#xff0c;以建立、维护和终止数据连接。它负责协调和管理数据传输的过程&am…...

Redis:set类型

Redis&#xff1a;set类型 set命令SADDSMEMBERSSISMEMBERSCARDSPOPSRANDMEMBERSMOVESREM 集合间操作SINTERSINTERSTORESUNIONSUNIONSTORESDIFFSDIFFSTORE 内部编码intsethashtable 当把一些关联的数据放到一起&#xff0c;就构成一个集合。在Redis中&#xff0c;使用set类型维护…...

九大排序之插入排序

1.前言 插入排序是把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中&#xff0c;直到所有的记录插入完为止&#xff0c;得到一个新的有序序列 。实际中我们玩扑克牌时&#xff0c;就用了插入排序的思想。 本章重点&#xff1a;主要着重的介绍两种插入排序…...

DNABERT: 一个基于 Transformer 双向编码器表征的预训练 DNA 语言模型

本文结合 DNABERT 的原文&#xff0c;主要介绍了&#xff1a; Overview of DNABERT 开发 DNABERT 的背景 DNABERT 的 tokenization DNABERT 的模型架构 DNABERT 的预训练 基于微调 DNABERT 的应用 1. Overview of DNABERT 我们之前介绍了 BERT&#xff0c;它是一个基于 Transfo…...

基于Hive和Hadoop的电商消费分析系统

本项目是一个基于大数据技术的电商消费分析系统&#xff0c;旨在为用户提供全面的电商消费信息和深入的消费行为分析。系统采用 Hadoop 平台进行大规模数据存储和处理&#xff0c;利用 MapReduce 进行数据分析和处理&#xff0c;通过 Sqoop 实现数据的导入导出&#xff0c;以 S…...

记一次炉石传说记牌器 Crash 排查经历

大家好这里是 Geek技术前线。最近在打炉石过程中遇到了HSTracker记牌器的一个闪退问题&#xff0c;尝试性排查了下原因。这里简单记录一下 最近炉石国服回归&#xff1b;由于设备限制&#xff0c;我基本只会在 Mac 上打炉石。并且由于主要打竞技场&#xff0c;所以记牌器是必不…...

精益驱动的敏捷开发

1. 什么是精益&#xff1f;精益能给软件开发带来什么&#xff1f; 精益是一种起源于制造业的管理哲学&#xff0c;尤其是从丰田的生产体系中发展而来。它的核心目标是通过最小化浪费、提高效率和优化流程来实现高效的生产。精益的核心原则包括&#xff1a; 消除浪费&#xff…...

SolidWorks机器转ROS2 URDF

文章目录 开发环境SolidWords插件使用生成urdf文件之后的处理CMakeLists文件修改package.xml变更Launch更改运行 开发环境 Linux系统&#xff1a;Ubuntu 22.04 Ros2版本&#xff1a;humble Solidwords版本&#xff1a;2023 &#xff08;2019以上版本应该都是可以的&#xff09…...

(Linux驱动学习 - 6).Linux中断

一. Linux 中断 API 函数 1.中断号 每个中断都有一个中断号&#xff0c;通过中断号即可区分不同的中断&#xff0c;有的资料也把中断号叫做中 断线。在 Linux 内核中使用一个 int 变量表示中断号。 2.申请中断 - request_irq 函数原型&#xff1a; int request_irq(unsigne…...

SpringBoot驱动的明星周边产品电商解决方案

1系统概述 1.1 研究背景 如今互联网高速发展&#xff0c;网络遍布全球&#xff0c;通过互联网发布的消息能快而方便的传播到世界每个角落&#xff0c;并且互联网上能传播的信息也很广&#xff0c;比如文字、图片、声音、视频等。从而&#xff0c;这种种好处使得互联网成了信息传…...

C++、Ruby和JavaScript

C C最初被称为带类的C, 兼容C的语法&#xff0c;此既是C得以流行的前提&#xff0c;也是C某些语法被捆绑的根源。C的来源于C语言的递增运算符&#xff0c;代表增加&#xff0c;意义为扩展。 C的历史 C类的设计思想来源于Simula. Simula为模拟的意思&#xff0c;被称为最早的面向…...

React Native 开发环境搭建(全平台详解)

React Native 开发环境搭建&#xff08;全平台详解&#xff09; 在开始使用 React Native 开发移动应用之前&#xff0c;正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南&#xff0c;涵盖 macOS 和 Windows 平台的配置步骤&#xff0c;如何在 Android 和 iOS…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂&#xff08;如抗体、抑制肽&#xff09;在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上&#xff0c;高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术&#xff0c;但这类方法普遍面临资源消耗巨大、研发周期冗长…...

基于Flask实现的医疗保险欺诈识别监测模型

基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施&#xff0c;由雇主和个人按一定比例缴纳保险费&#xff0c;建立社会医疗保险基金&#xff0c;支付雇员医疗费用的一种医疗保险制度&#xff0c; 它是促进社会文明和进步的…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现

摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序&#xff0c;以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务&#xff0c;提供稳定高效的数据处理与业务逻辑支持&#xff1b;利用 uniapp 实现跨平台前…...

HBuilderX安装(uni-app和小程序开发)

下载HBuilderX 访问官方网站&#xff1a;https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本&#xff1a; Windows版&#xff08;推荐下载标准版&#xff09; Windows系统安装步骤 运行安装程序&#xff1a; 双击下载的.exe安装文件 如果出现安全提示&…...

网络编程(UDP编程)

思维导图 UDP基础编程&#xff08;单播&#xff09; 1.流程图 服务器&#xff1a;短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...

基于 TAPD 进行项目管理

起因 自己写了个小工具&#xff0c;仓库用的Github。之前在用markdown进行需求管理&#xff0c;现在随着功能的增加&#xff0c;感觉有点难以管理了&#xff0c;所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD&#xff0c;需要提供一个企业名新建一个项目&#…...

华为OD机考-机房布局

import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...

Caliper 配置文件解析:fisco-bcos.json

config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...

ubuntu22.04有线网络无法连接,图标也没了

今天突然无法有线网络无法连接任何设备&#xff0c;并且图标都没了 错误案例 往上一顿搜索&#xff0c;试了很多博客都不行&#xff0c;比如 Ubuntu22.04右上角网络图标消失 最后解决的办法 下载网卡驱动&#xff0c;重新安装 操作步骤 查看自己网卡的型号 lspci | gre…...