由于之前公司一直用的是MSMQ(Microsoft Message Queue),最近搭建了一个RabbitMQ,这里简单讲一下安装与使用
一、安装
1.下载并安装erlang,地址:http://www.erlang.org/downloads
选择OTP 22.0 Windows 64-bit Binary File (94094976) 下载,并安装(安装步骤就是一直下一步直到完成)
2.下载并安装RabbitMQ
地址:http://www.rabbitmq.com/download.html
选择Windows installer下载,并安装(也是一直下一步)
二、运行RabbitMQ
1.打开CMD,依次执行以下命令
CD C:\Program Files\RabbitMQ Server\rabbitmq_server-3.7.16\sbin
rabbitmq-plugins enable rabbitmq_management
2.打开windows图标,点击RabbitMQ Server-start,就启动了RabbitMQ服务了
此时访问:http://localhost:15672/#/ 就可以登录了,默认端口是15672,账户名密码都是:guest
3.外部访问,开放端口
当部署完成时候,你会发现,外部无法访问RabbitMQ管理页面,仅仅只有在本机上才能访问这个地址(我用的是WndowsServer2019,用虚拟机部署的,IP地址为:192.168.196.128),所以我访问:http://192.168.196.128:15672/#/,发现无法访问此页面,这是由于服务器屏蔽了这个端口,我们需要开放他
依此打开Windows防火墙-高级设置
依此选择 入站规则-->端口
选择所有本地端口(实际应用中不建议这样,由于我是完全用来测试的,可以这样)
然后一直下一步,就OK了
4.添加RabbitMQ账户
开放端口之后,就可以访问RabbitMQ管理页面了,可是此时外部是无法用guest账户登录的(此账户只能在http://localhost:15672 登陆),我们需要新建一个账户
在部署服务本机访问:http://localhost:15672/ 用guest登陆,登陆进去之后,点击Admin
依次展开Add a user-->填写新增的账户名密码信息-->点击Add user,账户就新增好了
不过此时还没有权限,点击你刚刚新增的admin,如下图
点进去之后,可以看到如下界面
什么都不用管,点击Set permission就可以了
此时,你就可以外部用admin账户访问了
三、应用
C#代码模拟发送消息(生产者)与接收消息(消费者)
生产者代码
ConnectionFactory factory = new ConnectionFactory
{
UserName = "admin",//用户名
Password = "admin",//密码
HostName = "192.168.196.128",//IP
};
//创建连接
var connection = factory.CreateConnection();
//创建通道
var channel = connection.CreateModel();
//声明一个队列
channel.QueueDeclare("TestMessage", false, false, false, null);
Console.WriteLine("\nRabbitMQ连接成功,请输入要发送的消息:");
string input = Console.ReadLine();
var sendBytes = Encoding.UTF8.GetBytes(input);
channel.BasicPublish("", "TestMessage", null, sendBytes);
channel.Close();
connection.Close();
消费者代码
ConnectionFactory factory = new ConnectionFactory
{
UserName = "admin",//用户名
Password = "admin",//密码
HostName = "192.168.196.128"
};
//创建连接
var connection = factory.CreateConnection();
//创建通道
var channel = connection.CreateModel();
//事件基本消费者
EventingBasicConsumer consumer = new EventingBasicConsumer(channel);
//接收到消息事件
consumer.Received += (ch, ea) =>
{
var message = Encoding.UTF8.GetString(ea.Body);
Console.WriteLine($"收到消息: {message}");
//确认该消息已被消费
channel.BasicAck(ea.DeliveryTag, false);
}; //启动消费者 设置为手动应答消息
channel.BasicConsume("TestMessage", false, consumer);
Console.WriteLine("消费者已启动");
Console.ReadKey();
channel.Dispose();
connection.Close();
这样,一个消息队列就处理完成了