C#实现RabbitMQ消息持久化

下面为你提供使用C#实现RabbitMQ消息持久化的完整代码示例:

using RabbitMQ.Client;
using System.Text;

class MessageProducer
{
    static void Main()
    {
        // 创建连接工厂
        var factory = new ConnectionFactory() { HostName = "localhost" };
        
        // 创建连接和通道
        using (var connection = factory.CreateConnection())
        using (var channel = connection.CreateModel())
        {
            // 声明持久化交换机
            channel.ExchangeDeclare(
                exchange: "persistent_exchange",
                type: ExchangeType.Direct,
                durable: true,     // 设置为持久化
                autoDelete: false,
                arguments: null);

            // 声明持久化队列
            channel.QueueDeclare(
                queue: "persistent_queue",
                durable: true,     // 设置为持久化
                exclusive: false,
                autoDelete: false,
                arguments: null);

            // 绑定队列到交换机
            channel.QueueBind(
                queue: "persistent_queue",
                exchange: "persistent_exchange",
                routingKey: "persistent_key");

            // 准备消息内容
            string message = "Hello, persistent message!";
            var body = Encoding.UTF8.GetBytes(message);

            // 设置消息属性为持久化
            var properties = channel.CreateBasicProperties();
            properties.Persistent = true; // 消息持久化的关键设置

            // 发布持久化消息
            channel.BasicPublish(
                exchange: "persistent_exchange",
                routingKey: "persistent_key",
                basicProperties: properties,
                body: body);

            Console.WriteLine(" [x] Sent '{0}'", message);
        }

        Console.WriteLine(" Press [enter] to exit.");
        Console.ReadLine();
    }
}

消费者端代码如下:

using RabbitMQ.Client;
using RabbitMQ.Client.Events;
using System.Text;

class MessageConsumer
{
    static void Main()
    {
        var factory = new ConnectionFactory() { HostName = "localhost" };
        
        using (var connection = factory.CreateConnection())
        using (var channel = connection.CreateModel())
        {
            // 声明持久化队列(需与生产者一致)
            channel.QueueDeclare(
                queue: "persistent_queue",
                durable: true,
                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: "persistent_queue",
                autoAck: true,
                consumer: consumer);

            Console.WriteLine(" Press [enter] to exit.");
            Console.ReadLine();
        }
    }
}

关键配置说明

  1. 交换机持久化:在ExchangeDeclare方法中,将durable参数设为true
  2. 队列持久化:在QueueDeclare方法中,把durable参数设置为true
  3. 消息持久化
    • 创建IBasicProperties对象。
    • Persistent属性设为true
    • 在发布消息时传入该属性对象。

依赖安装

要运行上述代码,需先通过NuGet安装RabbitMQ客户端库:

Install-Package RabbitMQ.Client

注意事项

  1. 只有当交换机、队列和消息这三个方面都配置为持久化时,才能保证在RabbitMQ重启后消息不会丢失。
  2. 若队列未被声明为持久化,那么即使消息被标记为持久化,在RabbitMQ重启后,该队列及其包含的消息也会丢失。
  3. 消息持久化会带来一些性能开销,因为消息需要被写入磁盘。
  4. 建议在生产者和消费者两端都声明队列和交换机,以确保它们的配置一致。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值