使用 .NET Core 实现 RabbitMQ 消息队列的详细教程

embedded/2025/3/18 11:33:31/

RabbitMQ 是一个流行的消息队列中间件,它允许应用程序通过异步消息的方式进行通信。RabbitMQ 支持 AMQP 协议,可以通过多种方式与应用程序交互。在本教程中,我们将深入探讨如何在 .NET Core 环境中使用 RabbitMQ 来实现消息队列。我们将学习如何在生产者端发送消息,消费者端接收消息,并确保消息的可靠性。

目录

  1. 安装和配置 RabbitMQ
  2. 安装 RabbitMQ 客户端库
  3. 创建生产者(Producer)
  4. 创建消费者(Consumer)
  5. 持久化消息
  6. 消息确认机制
  7. 运行和测试
  8. 总结

1. 安装和配置 RabbitMQ

在开始使用 RabbitMQ 之前,首先需要确保你的机器上已经安装并运行 RabbitMQ。可以通过以下方式安装 RabbitMQ:

使用 Docker 安装 RabbitMQ

RabbitMQ 提供了官方的 Docker 镜像,这使得在本地机器上运行 RabbitMQ 非常简单。

docker pull rabbitmq:management
docker run -d -p 5672:5672 -p 15672:15672 rabbitmq:management
  • 5672 是 RabbitMQ 的默认消息队列端口。
  • 15672 是 RabbitMQ 管理插件的 Web 界面端口。通过浏览器访问 http://localhost:15672 可以登录 RabbitMQ 管理界面,默认的用户名和密码都是 guest

安装并启动 RabbitMQ 后,您可以继续进行开发。

2. 安装 RabbitMQ 客户端库

在 .NET Core 中与 RabbitMQ 进行交互,我们需要使用 RabbitMQ.Client NuGet 包。可以通过以下命令在项目中添加这个依赖:

dotnet add package RabbitMQ.Client

这个库提供了与 RabbitMQ 服务进行交互所需的所有工具。

3. 创建生产者(Producer)

生产者是负责将消息发送到 RabbitMQ 的应用程序。它通过连接到 RabbitMQ 服务器、创建一个队列和交换机,将消息发布到队列中。

创建消息生产者代码

下面是一个基本的生产者示例代码,展示了如何连接到 RabbitMQ,声明队列,并发送一条简单的消息:

using RabbitMQ.Client;
using System;
using System.Text;class Program
{static void Main(string[] args){// 创建连接工厂var factory = new ConnectionFactory() { HostName = "localhost" };// 创建连接和通道using (var connection = factory.CreateConnection())using (var channel = connection.CreateModel()){// 声明一个队列(确保队列存在)channel.QueueDeclare(queue: "hello_queue", durable: false, exclusive: false, autoDelete: false, arguments: null);// 创建消息string message = "Hello, RabbitMQ!";var body = Encoding.UTF8.GetBytes(message);// 发送消息到队列channel.BasicPublish(exchange: "", routingKey: "hello_queue", basicProperties: null, body: body);Console.WriteLine(" [x] Sent {0}", message);}Console.WriteLine(" Press [enter] to exit.");Console.ReadLine();}
}

在上面的代码中:

  • ConnectionFactory 用来创建连接到 RabbitMQ 服务器的连接。
  • QueueDeclare 用来声明一个队列,确保队列存在。如果队列已经存在,声明将被忽略。
  • BasicPublish 用来将消息发送到队列。

参数说明:

  • queue: 队列的名称(此例中是 hello_queue)。
  • durable: 是否将队列标记为持久化。如果设置为 true,即使 RabbitMQ 重启,队列也会存在。
  • exclusive: 是否使队列只对当前连接可用。
  • autoDelete: 是否在最后一个消费者断开连接时自动删除队列。

4. 创建消费者(Consumer)

消费者从队列中获取并处理消息。消费者通常是另一个应用程序,它会连接到 RabbitMQ,并持续地从队列中取出消息进行处理。

创建消息消费者代码

using RabbitMQ.Client;
using RabbitMQ.Client.Events;
using System;
using System.Text;class Program
{static void Main(string[] args){// 创建连接工厂var factory = new ConnectionFactory() { HostName = "localhost" };// 创建连接和通道using (var connection = factory.CreateConnection())using (var channel = connection.CreateModel()){// 声明队列,确保消费者能够连接到相同的队列channel.QueueDeclare(queue: "hello_queue", durable: false, exclusive: false, autoDelete: false, arguments: null);// 创建消费者对象var consumer = new EventingBasicConsumer(channel);// 消息处理逻辑consumer.Received += (model, ea) =>{var body = ea.Body.ToArray();var message = Encoding.UTF8.GetString(body);Console.WriteLine(" [x] Received {0}", message);};// 开始消费消息channel.BasicConsume(queue: "hello_queue", autoAck: true, consumer: consumer);Console.WriteLine(" Press [enter] to exit.");Console.ReadLine();}}
}

在上面的代码中:

  • QueueDeclare 用来确保消费者连接到相同的队列。
  • EventingBasicConsumer 是消费者的实现,用于异步接收消息。
  • BasicConsume 用于开始消费消息,autoAck 设置为 true,表示自动确认消息。

参数说明:

  • autoAck: 如果设置为 true,消费者会自动确认消息。如果设置为 false,需要手动确认消息。

5. 持久化消息

如果您希望在 RabbitMQ 重启后保持消息的持久性,可以在生产者和消费者中启用消息的持久化。

消息持久化设置

在生产者端发送持久化消息:

// 设置消息持久化
var properties = channel.CreateBasicProperties();
properties.Persistent = true; // 设置消息为持久化channel.BasicPublish(exchange: "", routingKey: "hello_queue", basicProperties: properties, body: body);

此外,声明队列时也需要设置 durable: true,确保队列本身是持久化的。

channel.QueueDeclare(queue: "hello_queue", durable: true, exclusive: false, autoDelete: false, arguments: null);

6. 消息确认机制

在消息传递过程中,为了确保消息被成功消费并避免丢失,可以启用消息确认机制。在这种情况下,消费者需要显式确认消息。

启用手动消息确认

在消费者端禁用自动确认,并手动确认每条已成功处理的消息:

channel.BasicConsume(queue: "hello_queue", autoAck: false, consumer: consumer);consumer.Received += (model, ea) =>
{var body = ea.Body.ToArray();var message = Encoding.UTF8.GetString(body);Console.WriteLine(" [x] Received {0}", message);// 手动确认消息channel.BasicAck(deliveryTag: ea.DeliveryTag, multiple: false);
};

BasicAck 用于确认消息已经被处理。deliveryTag 是消息的标识符,multiple 参数表示是否确认多个消息。

7. 运行和测试

  1. 启动消费者应用程序,确保它可以连接到 RabbitMQ 并等待消息。
  2. 启动生产者应用程序,它将发送消息到 RabbitMQ 队列。
  3. 消费者将从队列中接收到消息,并进行处理。

如果一切配置正确,您将在控制台中看到生产者发送的消息以及消费者处理的消息。

8. 总结

通过本教程,我们学习了如何在 .NET Core 中使用 RabbitMQ 实现一个简单的消息队列系统。关键步骤包括:

  • 安装 RabbitMQ 客户端库。
  • 在生产者中声明队列并发送消息。
  • 在消费者中声明队列并处理消息。
  • 配置消息持久化和确认机制,确保消息的可靠性。

RabbitMQ 是一个强大的消息队列中间件,适用于各种需要解耦和异步通信的应用程序。通过灵活的交换机和队列配置,您可以实现不同的消息传递模式,以满足不同的业务需求。


http://www.ppmy.cn/embedded/173580.html

相关文章

Mysql的库操作

🏝️专栏:Mysql_猫咪-9527的博客-CSDN博客 🌅主页:猫咪-9527-CSDN博客 “欲穷千里目,更上一层楼。会当凌绝顶,一览众山小。” 目录 1. 简单数据库操作 1.1 查看数据库 1.2 创建数据库 1.3 使用数据库 …

DeepSeek-R1本地化部署(Mac)

一、下载 Ollama 本地化部署需要用到 Ollama,它能支持很多大模型。官方网站:https://ollama.com/ 点击 Download 即可,支持macOS,Linux 和 Windows;我下载的是 mac 版本,要求macOS 11 Big Sur or later,Ol…

【2025年3月最新】Cities_Skylines:城市天际线1全DLC解锁下载与教程

亲测2025年3月11日能用,能解锁全部DLC 使用教程 点击下载 点击下载

使用DeepSeek制作可视化图表和流程图

用DeepSeek来制作可视化图表,搭配python、mermaid、html来实现可视化,我已经测试过好几种场景,都能实现自动化的代码生成,效果还是不错的,流程如下。 统计图表 (搭配Matplotlib来做) Python中的…

如何用Deepseek制作流程图?

使用Deepseek制作流程图,本质上是让AI根据你的需求,生成相关流程图的代码,然后在流程图编辑器中渲染,类似于Python一样,ChatGPT可以生成代码,但仍需在IDE中执行。 你知道绘制流程图最高效的工具是什么吗&a…

各省水资源平台 水资源遥测终端机都用什么协议

各个省水资源平台 水资源遥测终端机 的建设大部分从2012年开始启动,经过多年建设,基本都已经形成了稳定的通讯要求;河北瑾航科技 遥测终端机,兼容了大部分省市的通讯协议,如果需要,可以咨询和互相学习&…

51单片机学习记录

一、STC89C51RC/RD系列单片机结构 STC89C51RC/RD系列单片机的内部结构框图如下图所示。STC89C51RC/RD单片机中包含中央处理器(CPU)、程序存储器(Flash)、数据存储器(SRAM)、定时/计数器、UART串口、I/O接口、EEPROM、看…

二叉树算法题实战:从遍历到子树判断

目录 一、引言 二、判断两棵二叉树是否相同 思路 代码实现 注意点 三、二叉树的中序遍历 思路 代码实现 注意点 四、判断一棵树是否为另一棵树的子树 思路 代码实现 注意点 ​编辑 五、补充 一、引言 作者主页:共享家9527-CSDN博客 作者代码仓库&am…