前言
本篇无创新,都是对下面这篇文章的拙劣模仿。
参考1:https://blog.youkuaiyun.com/lzx1991610/article/details/102970854
参考2:
https://www.cnblogs.com/abeam/p/11872956.html
实验环境:win10、 VS2022
使用语言:C#
提示:以下是本篇文章正文内容
一、背景
RabbitMQ 3.10.5 发布 2022 年 6 月 6 日,RabbitMQ 团队很高兴地宣布 RabbitMQ 3.10.5 的发布,这是 RabbitMQ 3.10.x 系列的维护版本。
此版本需要 Erlang/OTP 23.2 并支持 Erlang 24 和 Erlang 25。
二、安装步骤
1.下载Erlang
Erlang/OTP
Link:https://www.erlang.org/downloads?
【我下的是Erlang/OTP 25.0.1】
2.下载RabbitMQ
Link: https://www.rabbitmq.com/install-windows.html#installer
下载rabbitmq-Server-3.10.5.exe
3.安装成功
三、配置环境
点击管理工具
输入命令:rabbitmq-plugins enable rabbitmq_management
试了一下命令,非常好玩:
停止:net stop RabbitMQ
启动:net start RabbitMQ
在浏览器中输入地址查看:http://127.0.0.1:15672/
使用默认账户登录:guest/ guest
就进去啦。详细的介绍,可以参考这个link:https://blog.youkuaiyun.com/lzx1991610/article/details/102970854
四、初步使用
1.项目准备
准备两个项目,我这里准备的是Test2(生产者)和test3(消费者),分别引入【RabbitMQ.Client】包即可
2.代码实现
下面是 test2的RabbitMQProducer.cs
的代码。
//生产者
internal class RabbitMQProducer
{
private ConnectionFactory factory;
public RabbitMQProducer()
{
factory = new ConnectionFactory(); //连接 RabbitMQ 工厂实例
factory.HostName = "localhost"; //要连接到的主机,默认为 localhost
factory.Port = 5672; //连接断开,默认为 -1(5672)
factory.UserName = "guest"; //RabbitMQ 连接用户名,默认为 guest
factory.Password = "guest"; //RabbitMQ 连接密码,默认为 guest
}
public void CreateHello()
{
//创建连接对象
using (var connection = factory.CreateConnection())
{
//创建一个新的通道、会话和模型
using (var channel = connection.CreateModel())
{
/*
* 创建一个名为 myQueue1 的消息队列,如果名称相同不会重复创建,参数解释:
* 参1:myQueue1, 消息队列名称;
* 参2:false, 是否持久化,持久化的队列会存盘,服务器重启后任然存在;
* 参3:false, 是否为排他队列,排他队列表示仅对首次声明它的连接可见,并在连接断开时自动删除。这种队列适用于一个客户端同时发送和读取消息的应用场景。
* 参4:false, 是否自动删除,自动删除的前提是:至少有一个消费者连接到这个队列,之后所有与这个队列连接的消费者都断开时,才会自动删除。
* 参5:设置队列的其他一些参数,如 x-rnessage-ttl、x-expires、x-rnax-length、x-rnax-length-bytes、x-dead-letter-exchange、x-deadletter-routing-key、x-rnax-priority 等。
*/
channel.QueueDeclare("myQueue1", false, false, false, null);
var properties = channel.CreateBasicProperties();
properties.DeliveryMode = 1;
string message = "Hello RabbitMQ"; //消息内容
byte[] body = Encoding.UTF8.GetBytes(message);
channel.BasicPublish("", "myQueue1", properties, body); //发送(生产)消息
Console.WriteLine($"Send Message: {message}");
}
}
Console.ReadLine();
}
}
下面是 test3的RabbitMQConsumer.cs
的代码。
public class RabbitMQConsumer
{
private ConnectionFactory factory;
public RabbitMQConsumer()
{
factory = new ConnectionFactory(); //连接 RabbitMQ 工厂实例
factory.HostName = "localhost"; //要连接到的主机,默认为 localhost
factory.Port = 5672; //连接断开,默认为 -1(5672)
factory.UserName = "guest"; //RabbitMQ 连接用户名,默认为 guest
factory.Password = "guest"; //RabbitMQ 连接密码,默认为 guest
}
public void closeHello()
{
//不能放入 using 语句中,否则当 using 语句结束后会 Close 连接,EventingBasicConsumer.Received 事件将不会被触发
var connection = factory.CreateConnection();
var channel = connection.CreateModel();
channel.QueueDeclare("myQueue1", false, false, false, null);
var consumer = new EventingBasicConsumer(channel); //消费者(指定消息通道)
channel.BasicConsume("myQueue1", true, consumer); //消费消息(在当前通道中监听 myQueue1 队列,并进行消费)
//该事件在接收到消息时触发
consumer.Received += (sender, e) =>
{
byte[] body = e.Body.ToArray(); //消息字节数组
string message = Encoding.UTF8.GetString(body); //消息内容
Console.WriteLine($"Received: {message}, {DateTime.Now.ToString("HH: mm:ss fff")}");
};
Console.ReadLine();
connection.Close();
channel.Close();
}
}
3.实验结果
运行完生产者代码之后,在queues中ready会变成1,然后再运行消费者ready就会变成0
总结
参考1:https://blog.youkuaiyun.com/lzx1991610/article/details/102970854
参考2:https://www.cnblogs.com/abeam/p/11872956.html
再次感谢两位大佬的文章