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
**方法中,各参数的含义如下:
-
queue:队列的名称。这是必需的参数,用于指定要声明的队列的名称。
-
durable:指定队列是否持久化。如果设置为true,RabbitMQ会在服务器重启后保留该队列,否则在服务器重启后队列将被删除。默认值为false。
-
exclusive:指定队列是否为独占队列。如果设置为true,只有声明该队列的连接能够使用这个队列,连接关闭后队列将被删除。默认值为false。
-
autoDelete:指定当最后一个消费者断开连接之后,队列是否自动删除。如果设置为true,当最后一个消费者断开连接后,队列将被自动删除。默认值为false。
-
arguments:用于设置其他参数的可选参数。例如,可以使用arguments来设置队列的TTL(time to live)、死信交换机等特殊属性。
通过这些参数,您可以根据实际需求来声明一个队列,例如设置队列的持久化属性、独占性质和自动删除行为,以及其他特殊的队列参数。
在**channel.BasicPublish
**方法中,各参数的含义如下:
-
exchange:消息发送到的交换机的名称。交换机负责将消息路由到队列。空字符串表示默认交换机,消息会直接路由到指定的队列;非空字符串表示使用指定名称的交换机。
-
routingKey:路由键,用于将消息从交换机路由到队列。当消息发送到交换机时,交换机会根据路由键将消息路由到一个或多个队列。
-
basicProperties:消息的基本属性。可以设置消息的各种属性,比如消息的持久化、优先级、过期时间等。通常情况下,可以将其设置为null,表示使用默认的消息属性。
-
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消费者接收到消息的情况:
-
consumer.Received += (model, ea) =>:事件订阅语法,表示当消费者接收到消息时触发的事件。一旦消费者接收到消息,就会执行下面的花括号内的代码。这行代码是用于订阅指
-
queue: "hello":表示要订阅的队列名称为"hello",即消费者将从名为"hello"的队列中接收消息。
-
autoAck: true:表示是否自动确认消息。如果设置为true,当消费者接收到消息后,会立即向RabbitMQ服务器发送一个消息确认,告知服务器该消息已被处理。这意味着一旦消息被发送到消费者,RabbitMQ就会将其视为已成功处理,即使消费者尚未完成对消息的处理。这种方式可能会导致消息丢失或重复处理,因此在实际场景中需要谨慎使用。
- consumer: consumer:表示用于处理接收到消息的消费者对象。在这里,您可以传入之前创建的消费者对象,以便让RabbitMQ知道收到消息后将其交给哪个消费者进行处理。