MST
星途 面试题库

面试题:C#中使用RabbitMQ实现消息队列的基本步骤

在C#项目中,如果要使用RabbitMQ实现一个简单的消息队列,描述其主要的代码实现步骤,包括连接的建立、队列的声明、消息的发送与接收等。
20.0万 热度难度
编程语言C#

知识考点

AI 面试

面试题答案

一键面试
  1. 安装RabbitMQ.Client NuGet包: 在Visual Studio的项目中,通过NuGet包管理器搜索并安装RabbitMQ.Client包,这是C#与RabbitMQ交互的基础库。
  2. 建立连接
using RabbitMQ.Client;
// 建立连接工厂
var factory = new ConnectionFactory()
{
    HostName = "localhost", // RabbitMQ服务器地址
    UserName = "guest", // 用户名
    Password = "guest" // 密码
};
using (var connection = factory.CreateConnection())
using (var channel = connection.CreateModel())
{
    // 后续操作在这个channel中进行
}
  1. 队列声明
using RabbitMQ.Client;
var factory = new ConnectionFactory()
{
    HostName = "localhost",
    UserName = "guest",
    Password = "guest"
};
using (var connection = factory.CreateConnection())
using (var channel = connection.CreateModel())
{
    // 声明队列
    channel.QueueDeclare(
        queue: "myQueue", // 队列名称
        durable: false, // 是否持久化,false表示服务器重启队列消失
        exclusive: false, // 是否排他,false表示可被其他消费者访问
        autoDelete: false, // 是否自动删除,false表示队列使用完不自动删除
        arguments: null); // 其他参数
}
  1. 消息发送
using RabbitMQ.Client;
var factory = new ConnectionFactory()
{
    HostName = "localhost",
    UserName = "guest",
    Password = "guest"
};
using (var connection = factory.CreateConnection())
using (var channel = connection.CreateModel())
{
    channel.QueueDeclare(
        queue: "myQueue",
        durable: false,
        exclusive: false,
        autoDelete: false,
        arguments: null);
    string message = "Hello, RabbitMQ!";
    var body = System.Text.Encoding.UTF8.GetBytes(message);
    channel.BasicPublish(
        exchange: "", // 使用默认交换机
        routingKey: "myQueue", // 队列名称
        basicProperties: null,
        body: body);
    Console.WriteLine(" [x] Sent {0}", message);
}
  1. 消息接收
using RabbitMQ.Client;
using RabbitMQ.Client.Events;
using System.Text;
var factory = new ConnectionFactory()
{
    HostName = "localhost",
    UserName = "guest",
    Password = "guest"
};
using (var connection = factory.CreateConnection())
using (var channel = connection.CreateModel())
{
    channel.QueueDeclare(
        queue: "myQueue",
        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: "myQueue",
        autoAck: true, // 自动确认消息已接收,设置为false可手动确认
        consumer: consumer);
    Console.WriteLine(" Press [enter] to exit.");
    Console.ReadLine();
}