【C++】开源:RabbitMQ安装与配置使用(SimpleAmqpClient)

news2024/11/15 7:00:48

😏★,°:.☆( ̄▽ ̄)/$:.°★ 😏
这篇文章主要介绍。
无专精则不能成,无涉猎则不能通。——梁启超
欢迎来到我的博客,一起学习,共同进步。
喜欢的朋友可以关注一下,下次更新不迷路🥞

文章目录

    • :smirk:1. 项目介绍
    • :blush:2. 环境配置
    • :satisfied:3. 使用说明

😏1. 项目介绍

官网:https://www.rabbitmq.com/

参考链接:http://t.csdnimg.cn/z8UOG

RabbitMQ 是一个开源的消息中间件,最初由 Rabbit Technologies 公司开发,并在后来成为 Pivotal Software(现为 VMware 子公司)的一部分。它实现了高级消息队列协议(AMQP)标准,提供了可靠的、灵活的、可扩展的消息传递机制,被广泛应用于构建分布式系统中的消息通信架构。

以下是 RabbitMQ 的一些关键特点和功能:

1.消息队列: RabbitMQ 提供了一个消息队列系统,用于在生产者和消费者之间传递消息。它支持多种消息传递模式,包括点对点、发布/订阅等。

2.可靠性: RabbitMQ 提供了持久化消息、消息确认机制、错误处理等功能,确保消息能够可靠地发送和接收,同时能够处理网络故障和系统崩溃等情况。

3.灵活性: RabbitMQ 支持多种消息格式、消息路由规则、交换机类型和队列绑定,使其能够适应各种复杂的消息传递场景。

4.可扩展性: RabbitMQ 提供了集群和分区机制,可以方便地进行水平扩展,以处理大量的消息流量和提高系统的容错能力。

5.管理界面: RabbitMQ 提供了用户友好的管理界面,用于监控队列、交换机、连接、通道等状态,并进行配置管理和性能调优。

6.插件系统: RabbitMQ 提供了丰富的插件系统,可以扩展其功能,例如支持 STOMP、MQTT、Web STOMP、LDAP 等插件。

RabbitMQ 被广泛应用于微服务架构、分布式系统、消息驱动的架构、日志收集和分析等场景中,成为构建可靠、高效消息传递系统的重要工具之一。通过使用 RabbitMQ,开发人员可以轻松地构建分布式系统,实现异步通信、解耦组件、提高系统的可靠性和可扩展性。

常用的RabbitMQ(C++)代理平台有:AMQP-CPPSimpleAmqpClient。AMQP-CPP有基于asio、libev等多个示例,是基于c++17的,没跑通;这里就介绍SimpleAmqpClient,是在rabbitmq-c基础上的C++接口库。

😊2. 环境配置

首先,要有一个rabbitmq服务,可以在Linux上安装:

# 安装rabbitmq-server
sudo apt-get install --no-install-recommends rabbitmq-server
# 启动和启用 RabbitMQ Server,查看服务状态
sudo systemctl start rabbitmq-server
sudo systemctl enable rabbitmq-server
sudo systemctl status rabbitmq-server
# 安装管理插件并重启服务
sudo rabbitmq-plugins enable rabbitmq_management
sudo systemctl restart rabbitmq-server
# 可访问 http://localhost:15672 使用默认用户名和密码(guest/guest)登录来管理交换机、队列等

Github-rabbitmq-c:https://github.com/alanxz/rabbitmq-c
Github-SimpleAmqpClient:https://github.com/alanxz/SimpleAmqpClient

然后安装C++的客户端代理库:

# rabbitmq-c依赖
sudo apt-get install librabbitmq-dev
# SimpleAmqpClient
git clone https://github.com/alanxz/SimpleAmqpClient.git
cd SimpleAmqpClient
mkdir build
cd build
cmake ..
make
sudo make install
# 更新库
sudo ldconfig

g++编译示例:g++ -o main main.cpp -lSimpleAmqpClient -lrabbitmq

😆3. 使用说明

发布/生产者示例:

#include <SimpleAmqpClient/SimpleAmqpClient.h>
#include <iostream>

int main() {
    try {
        // 创建连接
        AmqpClient::Channel::ptr_t channel = AmqpClient::Channel::Create("localhost");

        // 声明队列
        std::string queue_name = "hello";
        channel->DeclareQueue(queue_name, false, true, false, false);

        // 创建生产者消息
        std::string message = "Hello World!";
        AmqpClient::BasicMessage::ptr_t msg = AmqpClient::BasicMessage::Create(message);
        std::cout << "=== produce message: " << message << std::endl;

        // 发送消息
        while (true) {
            channel->BasicPublish("", queue_name, msg);
            std::cout << "=== Sent " << message << std::endl;
            usleep(200 * 1000);
        }
        
    } catch (const std::exception &e) {
        std::cerr << e.what() << std::endl;
        return 1;
    }

    return 0;
}

订阅/消费者示例:

#include <SimpleAmqpClient/SimpleAmqpClient.h>
#include <iostream>

int main() {
    try {
        // 创建连接
        AmqpClient::Channel::ptr_t channel = AmqpClient::Channel::Create("localhost");

        // 声明队列
        std::string queue_name = "hello";
        channel->DeclareQueue(queue_name, false, true, false, false);

        // 消费者标记
        std::string consumer_tag = channel->BasicConsume(queue_name, "");

        std::cout << " [*] Waiting for messages. To exit press CTRL+C" << std::endl;

        while (true) {
            AmqpClient::Envelope::ptr_t envelope = channel->BasicConsumeMessage(consumer_tag);
            std::string message_body = envelope->Message()->Body();
            std::cout << "=== Received " << message_body << std::endl;
            usleep(10 * 1000);
        }
    } catch (const std::exception &e) {
        std::cerr << "Error: " << e.what() << std::endl;
        return 1;
    }

    return 0;
}

效果如下:

在这里插入图片描述

在这里插入图片描述

以上。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1702432.html

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

相关文章

Jlink卡死 JFlash keil 盗版JLINK

现象&#xff1a;用Keil打开Jlink配置页&#xff0c;会卡死。 解决方法&#xff1a;用旧版本的Jlink软件&#xff0c;因为淘宝买的很多JLINK下载器是盗版的&#xff0c;不支持新版本的JLINK软件。到https://www.segger.com/downloads/jlink下载旧版本的软件。 如果必须要用新版…

重量and体积,不要在傻傻的花冤枉钱寄快递了!

寄快递时有没有遇到过明明不重却被按体积收费的情况&#xff1f;别急&#xff0c;今天就来给大家揭秘快递收费的奥秘&#xff01; 实际重量和体积重量&#xff01; 首先&#xff0c;我们要明白两个概念&#xff1a;实际重量和体积重量。实际重量就是你看到的物品重量&#xf…

安装vllm的时候卡主:Collecting vllm-nccl-cu12<2.19,>=2.18 (from vllm)

按照vllm的时候卡主&#xff1a; ... Requirement already satisfied: typing-extensions in /home/wangguisen/miniconda3/lib/python3.10/site-packages (from vllm) (4.9.0) Requirement already satisfied: filelock>3.10.4 in /home/wangguisen/miniconda3/lib/python…

推荐二轮电动车仪表盘蓝牙主芯片方案-HS6621CGC

随着国内二轮电动车的火热开启&#xff0c;电动车的智能化程度越来越高&#xff1b;电动车的智能操控需求也越来越高&#xff0c;现在介绍蓝牙控制面板的一些功能&#xff1b;例如&#xff1a;定位&#xff08;GNSS&#xff09;&#xff0c;设防&#xff0c;实时上报数据&#…

ctfshow web入门 web306--web310源码审计

web306 这和之前的完全不一样了 <?php #error_reporting(0); session_start(); require service.php;$username$_POST[userid]; $userpwd$_POST[userpwd]; $servicenew service();$user$service->login($username,$userpwd); if($user){setcookie(user,base64_encode(…

JAVA中的代理:代理的作用+静态代理的实现+动态代理的实现

JAVA中的代理&#xff1a;代理的作用静态代理的实现动态代理的实现 一、代理的作用二、静态代理实现方式2.1 实现原理2.2 示例 三、动态代理 一、代理的作用 代理是一种设计模式 主要目的&#xff1a;提供了对目标对象另外的访问方式 代理的好处&#xff1a; 目标对象可以间…

告别低效率||智能BI财务分析软件

在当今信息爆炸的时代&#xff0c;财务数据作为企业运营的核心&#xff0c;其处理和分析的效率直接关系到企业的决策速度和市场竞争力。奥威BI软件凭借其卓越的性能和智能化的分析功能&#xff0c;为企业提供了一套高效、准确的财务分析解决方案。 奥威BI软件在财务分析中的优…

从0开始回顾ElasticSearch

1 elasticsearch概述 1.1 elasticsearch简介 官网: https://www.elastic.co/ ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎&#xff0c;基于RESTful web接口。Elasticsearch是用Java开发的&#xff0c;并作为Apache许可条款下的…

angr使用学习(持续更新)

首先我是直接在kali中安装的&#xff0c;也是边练边学的。 嗯&#xff0c;要在纯净python环境&#xff0c;所以是在 virtualenv 虚拟环境里&#xff0c;也不是特别会用这个&#xff0c;按照教程一步步做的 source venv/bin/activate 进入了对应环境 退出是 deactivate en,ipy…

重生之 SpringBoot3 入门保姆级学习(06、属性绑定)

重生之 SpringBoot3 入门保姆级学习&#xff08;06、属性绑定&#xff09; 2.3.1 使用 ConfigurationProperties2.3.2 使用 EnableConfigurationProperties 2.3.1 使用 ConfigurationProperties application.properties 文件书写相关配置 pig.id1 pig.name王萍 pig.age21方法一…

Sping源码(九)—— Bean的初始化(非懒加载)— ConversionService

序言 经过前面一系列的加载、解析等准备工作&#xff0c;此刻refresh方法的执行已经来到了尾声&#xff0c;接下来我们用几篇文章着重的介绍一下Bean的初始化 代码 着重看refresh()主流程中的finishBeanFactoryInitialization()方法。 finishBeanFactoryInitialization 方法…

python深入探索斐波那契数列:代码示例与不满足的外围条件

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、斐波那契数列的初步实现 二、外围条件的不满足情况 总结 一、斐波那契数列的初步实现 …

二叉树——堆的实现

一.前言 前面我们讲解了二叉树的概念以及二叉树的存储结构&#xff1a;https://blog.csdn.net/yiqingaa/article/details/139224974?spm1001.2014.3001.5502 今天我们主要讲讲二叉树的存储结构&#xff0c;以及堆的实现。 二.正文 1.二叉树的顺序结构及实现 1.1二叉树的顺序…

五款屏幕监控软件测评,哪一款屏幕监控软件适合企业

市场上有多款屏幕监控软件&#xff0c;其中一些因其实用的功能、良好的用户体验和广泛的用户基础而获得了较高的市场占有率和口碑。以下几款是较为受欢迎且功能全面的屏幕监控软件&#xff1a; 1、安企神软件&#xff1a; 领取7天试用版&#xff1a;https://work.weixin.qq.co…

【NumPy】关于numpy.sort()函数,看这一篇文章就够了

&#x1f9d1; 博主简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟&#xff0c;欢迎关注。提供嵌入式方向…

一致 VS 正确

“代码命名时&#xff0c;一致大于正确” 本文适合以下小伙伴阅读&#xff1a; 经常会有疑惑&#xff1a;这谁的单词拼错了&#xff0c;我之后要将错就错吗&#xff1f;时常感觉到&#xff1a;项目中的命名好乱啊&#xff0c;明明是一个东西怎么一堆不同的名字 好了&#xf…

企业选择定制化MES管理系统时需要考虑的核心功能

在当今制造业的数字化转型浪潮中&#xff0c;企业对于实现生产现场透明管理的需求愈发迫切。为了满足这一需求&#xff0c;MES管理系统成为了众多企业的首选解决方案。MES管理系统以其高度的灵活性和可定制性&#xff0c;能够根据不同行业的特性&#xff0c;为企业提供量身定制…

告别繁琐!Xinstall助你轻松实现APP地推结算,提升推广效率

随着移动互联网的迅猛发展&#xff0c;APP市场竞争日益激烈。面对线上推广转化率下降、成本上升的挑战&#xff0c;越来越多的APP厂商开始尝试线下地推这一更为直接、有效的推广方式。然而&#xff0c;地推结算过程中的种种问题却让许多企业头痛不已。今天&#xff0c;我们将为…

信息化项目必须进行验收测试吗?软件测试公司验收测试流程分享

信息化项目验收是指在软件开发完成之后&#xff0c;对其进行独立检查和确认&#xff0c;以确定它是否达到了预期的质量和功能需求。在进行验收之前&#xff0c;必须进行验收测试&#xff0c;这是非常重要的一步。 为什么要进行验收测试呢&#xff1f;好处可不少哦&#xff01;…

【uniapp】CSS实现多行文本展开收起的文字环绕效果

1. 效果图 收起状态 展开状态 2. 代码实现 <view class"word-wrap" id"descriptionTxt"><view class"fold-text" v-if"isFold"><text class"fold-btn" click"changFold">全文</text&g…