RabbitMQ Demo

1.首先安装RabbitMQ服务器,项目中添加RabbitMQ客户端库。以下是一个简单的示例,演示了如何在C#应用程序中发送和接收消息:
cs 复制代码
using RabbitMQ.Client;
using System;
using System.Text;

class Program
{
    static void Main()
    {
        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, RabbitMQ!";
            var body = Encoding.UTF8.GetBytes(message);

            channel.BasicPublish(exchange: "",
                                 routingKey: "hello",
                                 basicProperties: null,
                                 body: body);
            Console.WriteLine(" [x] Sent {0}", message);
        }

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

上述代码演示了一个简单的生产者,它连接到本地的RabbitMQ服务器,声明一个名为"hello"的队列,并向该队列发送一条消息。

在**channel.QueueDeclare**方法中,各参数的含义如下:

  1. queue:队列的名称。这是必需的参数,用于指定要声明的队列的名称。

  2. durable:指定队列是否持久化。如果设置为true,RabbitMQ会在服务器重启后保留该队列,否则在服务器重启后队列将被删除。默认值为false。

  3. exclusive:指定队列是否为独占队列。如果设置为true,只有声明该队列的连接能够使用这个队列,连接关闭后队列将被删除。默认值为false。

  4. autoDelete:指定当最后一个消费者断开连接之后,队列是否自动删除。如果设置为true,当最后一个消费者断开连接后,队列将被自动删除。默认值为false。

  5. arguments:用于设置其他参数的可选参数。例如,可以使用arguments来设置队列的TTL(time to live)、死信交换机等特殊属性。

通过这些参数,您可以根据实际需求来声明一个队列,例如设置队列的持久化属性、独占性质和自动删除行为,以及其他特殊的队列参数。

在**channel.BasicPublish**方法中,各参数的含义如下:

  1. exchange:消息发送到的交换机的名称。交换机负责将消息路由到队列。空字符串表示默认交换机,消息会直接路由到指定的队列;非空字符串表示使用指定名称的交换机。

  2. routingKey:路由键,用于将消息从交换机路由到队列。当消息发送到交换机时,交换机会根据路由键将消息路由到一个或多个队列。

  3. basicProperties:消息的基本属性。可以设置消息的各种属性,比如消息的持久化、优先级、过期时间等。通常情况下,可以将其设置为null,表示使用默认的消息属性。

  4. body:消息的内容。以字节数组的形式表示消息的实际内容。

通过这些参数,您可以将指定消息发送到交换机、使用的路由键,以及设置消息的属性和内容。这样就可以灵活地控制消息的发送行为。

2.下面是一个简单的消费者示例,它从队列中接收消息:
cs 复制代码
using RabbitMQ.Client;
using RabbitMQ.Client.Events;
using System;
using System.Text;

class Program
{
    static void Main()
    {
        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();
        }
    }
}

上述代码为一个简单的消费者,它连接到本地的RabbitMQ服务器,声明一个名为"hello"的队列,并开始从该队列接收消息。

ex:

事件处理器,用于处理RabbitMQ消费者接收到消息的情况:

  1. consumer.Received += (model, ea) =>:事件订阅语法,表示当消费者接收到消息时触发的事件。一旦消费者接收到消息,就会执行下面的花括号内的代码。这行代码是用于订阅指

  2. queue: "hello":表示要订阅的队列名称为"hello",即消费者将从名为"hello"的队列中接收消息。

  3. autoAck: true:表示是否自动确认消息。如果设置为true,当消费者接收到消息后,会立即向RabbitMQ服务器发送一个消息确认,告知服务器该消息已被处理。这意味着一旦消息被发送到消费者,RabbitMQ就会将其视为已成功处理,即使消费者尚未完成对消息的处理。这种方式可能会导致消息丢失或重复处理,因此在实际场景中需要谨慎使用。

    • consumer: consumer:表示用于处理接收到消息的消费者对象。在这里,您可以传入之前创建的消费者对象,以便让RabbitMQ知道收到消息后将其交给哪个消费者进行处理。
3.Demo为C#应用程序中使用RabbitMQ进行消息的发送和接收。在实际环境中,要考虑更多因素--错误处理、连接管理、序列化和反序列化等
相关推荐
正在走向自律30 分钟前
阿里云ESC服务器一次性全部迁移到另一个ESC
服务器·阿里云·云计算
gywl1 小时前
openEuler VM虚拟机操作(期末考试)
linux·服务器·网络·windows·http·centos
了一li2 小时前
Qt中的QProcess与Boost.Interprocess:实现多进程编程
服务器·数据库·qt
日记跟新中2 小时前
Ubuntu20.04 修改root密码
linux·运维·服务器
唐小旭3 小时前
服务器建立-错误:pyenv环境建立后python版本不对
运维·服务器·python
明 庭3 小时前
Ubuntu下通过Docker部署NGINX服务器
服务器·ubuntu·docker
BUG 4043 小时前
Linux——Shell
linux·运维·服务器
007php0073 小时前
Go语言zero项目部署后启动失败问题分析与解决
java·服务器·网络·python·golang·php·ai编程
yang_shengy3 小时前
【JavaEE】网络(6)
服务器·网络·http·https