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进行消息的发送和接收。在实际环境中,要考虑更多因素--错误处理、连接管理、序列化和反序列化等
相关推荐
hycccccch2 小时前
Canal+RabbitMQ实现MySQL数据增量同步
java·数据库·后端·rabbitmq
wirepuller_king3 小时前
创建Linux虚拟环境并远程连接,finalshell自定义壁纸
linux·运维·服务器
Yan-英杰3 小时前
【百日精通JAVA | SQL篇 | 第二篇】数据库操作
服务器·数据库·sql
风123456789~3 小时前
【Linux运维】查询指定日期的上月
linux·运维·服务器
还是鼠鼠4 小时前
Node.js全局生效的中间件
javascript·vscode·中间件·node.js·json·express
CC.cc.5 小时前
Linux系统之systemctl管理服务及编译安装配置文件安装实现systemctl管理服务
linux·运维·服务器
爱写代码的小朋友6 小时前
华三交换机配置常用命令
运维·服务器·网络
wangjun51597 小时前
jenkins 参数化发布到服务器 publish over ssh、label、Parameterized publishing
服务器·ssh·jenkins
愚润求学7 小时前
【Linux】Linux权限
linux·服务器·语法
低头不见7 小时前
一个服务器算分布式吗,分布式需要几个服务器
运维·服务器·分布式