C++开发基础之使用librabbitmq库实现RabbitMQ消息队列通信

在这里插入图片描述

1. 前言

RabbitMQ是一个流行的开源消息队列系统,支持多种消息协议,广泛用于构建分布式系统和微服务架构。可以在不同应用程序之间实现异步消息传递。在本文中,我们将熟悉如何使用C++与RabbitMQ进行消息通信。

2. 准备工作

在 Windows 平台上通过 vcpkg 安装 librabbitmq,并在 C++ 中使用该库实现 RabbitMQ 消息的发布和接收。librabbitmq 是官方的 C 客户端库,支持与 RabbitMQ 服务器的通信。在这里插入图片描述

2.1 安装 vcpkg

如果还没有安装 vcpkg,请按照以下步骤安装:

  1. 克隆 vcpkg 仓库:

    git clone https://github.com/microsoft/vcpkg.git
    
  2. 进入 vcpkg 目录并运行安装脚本:

    cd vcpkg
    .\bootstrap-vcpkg.bat
    
  3. 使用 vcpkg 安装 RabbitMQ C 库(librabbitmq):

    vcpkg install librabbitmq
    

在这里插入图片描述

安装完成后,将 vcpkg 集成到项目中:

vcpkg integrate install

这样,librabbitmq 库会被自动链接到 Visual Studio 中的 C++ 项目。
在这里插入图片描述

2.2 配置 Visual Studio 项目

在 Visual Studio 中创建新的 C++ 项目,确保项目中包含了 vcpkg 的安装路径。vcpkg 会自动配置项目,使其能够找到并链接到 librabbitmq 库。并且链接器附加依赖项添加rabbitmq.4.lib便于程序查找rabbitmq.4.dll库引用。
在这里插入图片描述

3. 实现消息发送和接收程序

我们将编写两个程序,一个用于发送消息,一个用于接收消息。这些程序将演示如何使用 librabbitmq 库连接到 RabbitMQ 服务器、声明交换机、绑定队列并发送或接收消息。

3.1 启动rabbitmq Server

在这里插入图片描述

3.2 发送消息的程序(Producer)

以下是消息发送者的完整代码,它会循环发送多条消息到指定的 RabbitMQ 交换机和队列。

#include <iostream>
#include <string>
#include <amqp.h>
#include <amqp_tcp_socket.h>
#include <thread>
#include <chrono>// 用于处理 AMQP 错误并输出错误信息
void die_on_error(amqp_rpc_reply_t x, const char* context) {if (x.reply_type != AMQP_RESPONSE_NORMAL) {std::cerr << "Error in " << context << ": "<< amqp_error_string2(x.library_error) << std::endl;exit(1);}
}int main() {const std::string hostname = "localhost";  // RabbitMQ 服务器地址const int port = 5672;  // RabbitMQ 默认端口const std::string exchange = "example_exchange";  // 交换机名称const std::string routing_key = "example_key";  // 路由键,用于绑定队列// 初始化连接amqp_connection_state_t conn = amqp_new_connection();amqp_socket_t* socket = amqp_tcp_socket_new(conn);if (!socket) {std::cerr << "Creating TCP socket failed" << std::endl;return 1;}// 打开 TCP 连接int status = amqp_socket_open(socket, hostname.c_str(), port);if (status) {std::cerr << "Opening TCP socket failed" << std::endl;return 1;}// 登录 RabbitMQdie_on_error(amqp_login(conn, "/", 0, 131072, 0, AMQP_SASL_METHOD_PLAIN, "guest", "guest"), "Logging in");amqp_channel_open(conn, 1);  // 打开信道die_on_error(amqp_get_rpc_reply(conn), "Opening channel");// 声明交换机(类型为 direct)amqp_exchange_declare(conn, 1, amqp_cstring_bytes(exchange.c_str()), amqp_cstring_bytes("direct"),0, 0, 0, 0, amqp_empty_table);die_on_error(amqp_get_rpc_reply(conn), "Declaring exchange");// 循环发送多条消息for (int i = 1; i <= 1000; ++i) {  // 发送 1000 条消息std::string message = "Hello, RabbitMQ! Message number: " + std::to_string(i);amqp_bytes_t message_bytes = amqp_cstring_bytes(message.c_str());// 设置消息属性amqp_basic_properties_t props;props._flags = AMQP_BASIC_CONTENT_TYPE_FLAG | AMQP_BASIC_DELIVERY_MODE_FLAG;props.content_type = amqp_cstring_bytes("text/plain");props.delivery_mode = 2;  // 持久化模式// 发送消息到交换机int result = amqp_basic_publish(conn, 1, amqp_cstring_bytes(exchange.c_str()), amqp_cstring_bytes(routing_key.c_str()),0, 0, &props, message_bytes);if (result < 0) {std::cerr << "Error publishing message " << i << std::endl;} else {std::cout << "Message " << i << " published: " << message << std::endl;}// 每次发送后等待 1 秒std::this_thread::sleep_for(std::chrono::seconds(1));}// 清理连接amqp_channel_close(conn, 1, AMQP_REPLY_SUCCESS);amqp_connection_close(conn, AMQP_REPLY_SUCCESS);amqp_destroy_connection(conn);return 0;
}

执行结果
在这里插入图片描述

3.3 接收消息的程序(Consumer)

以下是接收消息的完整代码,使用 amqp_consume_message 接收并打印消息内容。

#include <iostream>
#include <string>
#include <amqp.h>
#include <amqp_tcp_socket.h>// 错误处理函数,用于输出错误信息
void die_on_error(amqp_rpc_reply_t x, const char* context) {if (x.reply_type != AMQP_RESPONSE_NORMAL) {std::cerr << "Error in " << context << ": "<< amqp_error_string2(x.library_error) << std::endl;exit(1);}
}int main() {const std::string hostname = "localhost";  // RabbitMQ 服务器地址const int port = 5672;  // 端口const std::string queue = "example_queue";  // 队列名称const std::string exchange = "example_exchange";  // 交换机名称const std::string routing_key = "example_key";  // 路由键// 初始化连接amqp_connection_state_t conn = amqp_new_connection();amqp_socket_t* socket = amqp_tcp_socket_new(conn);if (!socket) {std::cerr << "Creating TCP socket failed" << std::endl;return 1;}// 打开 TCP 连接int status = amqp_socket_open(socket, hostname.c_str(), port);if (status) {std::cerr << "Opening TCP socket failed" << std::endl;return 1;}// 登录 RabbitMQdie_on_error(amqp_login(conn, "/", 0, 131072, 0, AMQP_SASL_METHOD_PLAIN, "guest", "guest"), "Logging in");amqp_channel_open(conn, 1);die_on_error(amqp_get_rpc_reply(conn), "Opening channel");// 声明交换机和队列,并绑定队列到交换机amqp_exchange_declare(conn, 1, amqp_cstring_bytes(exchange.c_str()), amqp_cstring_bytes("direct"),0, 0, 0, 0, amqp_empty_table);die_on_error(amqp_get_rpc_reply(conn), "Declaring exchange");amqp_queue_declare_ok_t* q = amqp_queue_declare(conn, 1, amqp_cstring_bytes(queue.c_str()), 0, 0, 0, 1, amqp_empty_table);die_on_error(amqp_get_rpc_reply(conn), "Declaring queue");amqp_queue_bind(conn, 1, amqp_cstring_bytes(queue.c_str()), amqp_cstring_bytes(exchange.c_str()), amqp_cstring_bytes(routing_key.c_str()), amqp_empty_table);die_on_error(amqp_get_rpc_reply(conn), "Binding queue");// 开始消费消息amqp_basic_consume(conn, 1, amqp_cstring_bytes(queue.c_str()), amqp_empty_bytes, 0, 1, 0, amqp_empty_table);die_on_error(amqp_get_rpc_reply(conn), "Consuming");while (true) {amqp_rpc_reply_t res;amqp_envelope_t envelope;// 释放资源amqp_maybe_release_buffers(conn);res = amqp_consume_message(conn, &envelope, NULL, 0);// 检查并打印接收到的消息if (res.reply_type == AMQP_RESPONSE_NORMAL) {std::cout << "Received: " << std::string((char*)envelope.message.body.bytes, envelope.message.body.len) << std::endl;amqp_destroy_envelope(&envelope);} else {std::cerr << "Error consuming message" << std::endl;break;}}

执行结果
在这里插入图片描述
可以查看RabbitMQ的webUI,了解消息的投递和消费情况
在这里插入图片描述

4. 总结

我们已完成了在 Windows 平台上通过 vcpkg 安装 librabbitmq 并用 C++ 实现 RabbitMQ 消息发送和接收的完整教程。

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

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

相关文章

【蓝桥杯 2021 省 B2】特殊年份

题目描述&#xff1a; 今年是 2021 年&#xff0c;2021 这个数字非常特殊, 它的千位和十位相等, 个位比百位大 1&#xff0c;我们称满足这样条件的年份为特殊年份。 输入 5 个年份&#xff0c;请计算这里面有多少个特殊年份。 输入格式 输入 5 行&#xff0c;每行一个 4 位十…

谈一谈高代理的一些特质

今天被问到了这样的一个问题&#xff0c;其实这是一个很有说法的话题。在我看来&#xff0c;他既拥有我之前提到的关于代理ip的一些特质&#xff0c;又有一些自己独特的味道。打个比方吧&#xff0c;就好比他很优秀&#xff0c;因为别人有的他也有&#xff0c;但是他过分迷人的…

AI写作(四)预训练语言模型:开启 AI 写作新时代(4/10)

一、预训练语言模型概述 ​ 预训练语言模型在自然语言处理领域占据着至关重要的地位。它以其卓越的语言理解和生成能力&#xff0c;成为众多自然语言处理任务的关键工具。 预训练语言模型的发展历程丰富而曲折。从早期的神经网络语言模型开始&#xff0c;逐渐发展到如今的大规…

图像处理实验一(Matlab Exercises and Image Fundamentals)

一、基本概念介绍 MATLAB是一种广泛使用的高性能语言&#xff0c;特别适用于数学计算、算法开发、数据分析和可视化。在图像处理领域&#xff0c;MATLAB提供了强大的工具和函数&#xff0c;使得图像的读取、处理和分析变得相对简单。通过MATLAB&#xff0c;用户可以实现从基本的…

番外-JDBC:2024年最新java连接数据库教程

前言 JavaScript的内容晚点更新&#xff0c;今天继续更新一点番外&#xff0c;今天更新的是jdbc&#xff0c;如何用java连接数据库 1.导包 要使java能够连接数据库我们需要导入一个包&#xff0c;请按照以下操作安装并导包 1.进入官网 MySQL 以上为官网链接进去后点击下载…

Ubuntu22.04安装DataEase

看到DataEase的驾驶舱&#xff0c;感觉比PowerBI要好用一点&#xff0c;于是搭建起来玩玩。Dataease推荐的操作系统是Ubuntu22.04/Centos 7。 下载了Ubuntu22.04和DataEase 最新版本的离线安装包 一.安装ubuntu22.04 在安装的时候&#xff0c;没有顺手设置IP地址信息&#xff…

vueRouter路由切换时实现页面子元素动画效果, 左右两侧滑入滑出效果

说明 vue路由切换时&#xff0c;当前页面左侧和右侧容器分别从两侧滑出&#xff0c;新页面左右分别从两侧滑入 效果展示 路由切换-滑入滑出效果 难点和踩坑 现路由和新路由始终存在一个页面根容器&#xff0c;通过<transition>组件&#xff0c;效果只能对页面根容器有效…

acwing算法基础03-递归,枚举

cWing 93. 递归实现组合型枚举 1.排序 考虑顺序 2. 组合 不考虑顺序 参数 -核心 递归 模板 1.指数型 选/不选 2. 排列 -考虑顺序 &#xff08;判重数组 不知道哪个数有有没有用过&#xff09;3.组合 不考虑顺序 数据范围 从n个数里选m个数 组合数中间点 取范围 #includ…

3174、清除数字

3174、[简单] 清除数字 1、题目描述 给你一个字符串 s 。你的任务是重复以下操作删除 所有 数字字符&#xff1a; 删除 第一个数字字符 以及它左边 最近 的 非数字 字符。 请你返回删除所有数字字符以后剩下的字符串。 2、解题思路 遍历字符串&#xff1a; 我们需要逐个遍…

服务器主板北桥南桥的发展

服务器是一种为客户机提供服务的高性能计算机。 主板芯片组在 2012 年以前均采用双芯片架构&#xff0c;即 MCHICH&#xff08;北桥芯片南桥芯片&#xff0c;Memory Controller Hub I/O Controller Hub&#xff09;&#xff0c;2012 年 Intel 推出单芯片架构后成为主流&#x…

ASP.NET 部署到IIS,访问其它服务器的共享文件 密码设定

asp.net 修改上面的 IIS需要在 配置文件 添加如下内容 》》》web.config <system.web><!--<identity impersonate"true"/>--><identity impersonate"true" userName"您的账号" password"您的密码" /><co…

多角度审视推荐系统

参考自《深度学习推荐系统》——王喆&#xff0c;用于学习和记录 介绍 推荐工程师需要从不同的维度审视推荐系统&#xff0c;不仅抓住问题的核心&#xff0c;更要从整体上思考推荐问题。 具体包括以下内容&#xff1a; &#xff08;1&#xff09;推荐系统如何选取和处理特征…

从0开始机器学习--Day23--支持向量机

经过前面的学习&#xff0c;我们已经知道在解决问题时&#xff0c;重要的不仅仅是要在算法A或算法B中选择更优的&#xff0c;而是考虑怎么选择用于学习算法的特征和正则化参数&#xff0c;相比神经网络和逻辑回归&#xff0c;支持向量机在这两个方面做得更好。 优化目标(Optimi…

Vulnhub靶场案例渗透[9]- HackableIII

文章目录 一、靶场搭建1. 靶场描述2. 下载靶机环境3. 靶场搭建 二、渗透靶场1. 确定靶机IP2. 探测靶场开放端口及对应服务3. 扫描网络目录结构4. 敏感数据获取5. 获取shell6. 提权6.1 敏感信息获取6.2 lxd提权 一、靶场搭建 1. 靶场描述 Focus on general concepts about CTF…

鸿蒙5.0版开发:使用HiLog打印日志(ArkTS)

在HarmonyOS 5.0中&#xff0c;HiLog是系统提供的一个日志系统&#xff0c;它允许应用和服务按照指定的级别、标识和格式字符串输出日志内容&#xff0c;帮助开发者了解应用的运行状态&#xff0c;更好地调试程序。本文将详细介绍如何在ArkTS中使用HiLog打印日志&#xff0c;并…

生成 Django 中文文档 PDF 版

文章目录 背景克隆 Django 文档和翻译仓库配置 conf.py设置和同步翻译生成 .pot 文件运行 sphinx-intl update复制翻译文件 构建 PDF生成 tex 文件安装 MikTeX生成 PDF Sphinx 生成文档 背景 浏览看到一个帖子&#xff0c;有个评论说可以用 sphinx 构建一个 pdf&#xff0c;正…

LeetCode 每日一题 2024/11/4-2024/11/10

记录了初步解题思路 以及本地实现代码&#xff1b;并不一定为最优 也希望大家能一起探讨 一起进步 目录 11/4 633. 平方数之和11/5 3222. 求出硬币游戏的赢家11/6 3254. 长度为 K 的子数组的能量值 I11/7 3255. 长度为 K 的子数组的能量值 II11/8 3235. 判断矩形的两个角落是否…

关于我、重生到500年前凭借C语言改变世界科技vlog.18——内存函数

文章目录 1. memcpy函数2. memmove函数3. memset函数4. memcmp函数希望读者们多多三连支持小编会继续更新你们的鼓励就是我前进的动力&#xff01; 内存函数是用于 操作内存块的一组函数&#xff0c;它们可以对内存进行复制、移动、设置和比较等操作。这些函数主要在 <str…

下划线命名json数组转java对象

/*** 将驼峰式命名的字符串转换为下划线方式* @param camelCase* @return*/ private static String toUnderlineCase(String camelCase) {return StrUtil.toUnderlineCase(camelCase); }/*** 下划线-赋值给-驼峰* @param source 源数据* @param target 目标数据*/ public stati…

【计算机网络】Socket编程接口

一、sockaddr结构体 二、Socket常见接口 1. socket() 2. bind() 3. recvfrom() 4. sendto() 5. listen() 6. accept() 三、基本转换函数 1. 与port有关的转换 2.与ip有关的转换 IP地址的表示有两种&#xff1a;点分十进制表示和整数表示 "192.168.1.100" …