Skip to content

基础案例

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 菜单

防止图片失效,这里记录步骤
  1. 点击 Queues 菜单
  2. 点击 Add a new queue,弹出下拉菜单
  3. 下方的很多参数可以进行选择(旁边有 ?的参数),如优先级(Lazy mode)、绑定死信队列(Dead letter exchange/routing key
  4. 执行步骤 3 后,在 Arguments 的第一个文本框弹出对应的参数,类似于 Map 的 key
  5. 第二个文本框填写参数,类似于 Map 的 value
  6. 第三个是下拉菜单,选择 value 类型
  7. 点击 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