基础案例
Hello RabbitMQ
用 C# 编写两个程序。发送单个消息的生产者和接收消息并打印出来的消费者
在下图中,「 P」 是我们的生产者,「 C」 是我们的消费者。中间的框是一个队列 RabbitMQ 代表使用者保留的消息缓冲区
步骤图:
消息生产者
安装 RabbitMQ.Client
NuGet 包
创建一个类作为生产者,最终生产消息到 RabbitMQ 的队列里
csharp
using System;
using System.Text;
using RabbitMQ.Client;
class Program
{
static void Main(string[] args)
{
// 创建一个连接工厂,并设置 RabbitMQ 服务器的主机名
var factory = new ConnectionFactory() { HostName = "localhost" };
// 创建一个连接
using (var connection = factory.CreateConnection())
// 创建一个通道
using (var channel = connection.CreateModel())
{
// 声明一个队列,如果队列不存在则创建
channel.QueueDeclare(queue: "hello",
durable: false, // 队列不是持久化的,服务器重启后队列会消失
exclusive: false, // 队列不是排他的,可以被多个连接使用
autoDelete: false, // 队列不会在没有消费者时自动删除
arguments: null); // 不设置额外的参数
// 创建要发送的消息
string message = "Hello World!";
// 将消息转换为字节数组
var body = Encoding.UTF8.GetBytes(message);
// 发布消息到队列,使用默认交换机(空字符串表示默认交换机)
channel.BasicPublish(exchange: "",
routingKey: "hello", // 将消息发送到 "hello" 队列
basicProperties: null, // 不设置额外的属性
body: body);
Console.WriteLine(" [x] Sent {0}", message); // 打印消息已发送的确认
}
}
}
消息消费者
创建一个类作为消费者,消费 RabbitMQ 队列的消息
csharp
using System;
using System.Text;
using RabbitMQ.Client;
using RabbitMQ.Client.Events;
class Program
{
static void Main(string[] args)
{
// 创建一个连接工厂,并设置 RabbitMQ 服务器的主机名
var factory = new ConnectionFactory() { HostName = "localhost" };
// 创建一个连接
using (var connection = factory.CreateConnection())
// 创建一个通道
using (var channel = connection.CreateModel())
{
// 声明一个队列,如果队列不存在则创建
channel.QueueDeclare(queue: "hello",
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", // 指定要消费的队列
autoAck: true, // 自动确认消息
consumer: consumer); // 使用创建的消费者
Console.WriteLine(" Press [enter] to exit."); // 提示用户按回车退出
Console.ReadLine(); // 等待用户输入
}
}
}
Web页面添加队列
进入自己的 RabbitMQ Web 页面,点击 Queues 菜单
防止图片失效,这里记录步骤
- 点击
Queues
菜单 - 点击
Add a new queue
,弹出下拉菜单 - 下方的很多参数可以进行选择(旁边有 ?的参数),如优先级(
Lazy mode
)、绑定死信队列(Dead letter exchange/routing key
) - 执行步骤 3 后,在
Arguments
的第一个文本框弹出对应的参数,类似于 Map 的 key - 第二个文本框填写参数,类似于 Map 的 value
- 第三个是下拉菜单,选择 value 类型
- 点击
Add queue
,添加队列
旁边有 ?的参数,就是 channel.queueDeclare(队列名/String, 持久化/boolean, 共享消费/boolean, 自动删除/boolean, 配置参数/Map);
或者 channel.basicPublish(交换机名/String, 队列名/String, 配置参数/Map, 消息/String);
的参数:配置参数/Map 的 key
Dotnet操作与封装
可以使用Nuget包来简化操作,也可以使用以下的方法来操作
见:https://mp.weixin.qq.com/s/VlRWHZ_QKE9vD4Am4irmeA
代码见:https://gitee.com/Pridejoy/PublicCode/tree/master/RabbitMQDemo