本文适合对消息队列有简单理解但是对于服务器搭建有困难的小伙伴。
首先我们需要搭建rabbitmq服务器来中转我们的消息。
1.1由于RabbitMQ使用Erlang语言编写,所有我们需要先安装Erlang环境(安装没什么难度直接双击运行就可以了)
1.2安装RabbitMQ服务端程序
以上安装包稍后会在文章下面贴出来。
使RabbitMQ以windows服务的方式在后台运行
1)cmd切换到sbin目录下面
2)执行:
rabbitmq-service install
rabbitmq-service enable
rabbitmq-service start
现在我们的rabbitmq服务端已经运行起来了。
我们可以尝试:rabbitmqctl status 来看一下服务器的运行状态
如果显示node没有连接上,需要到C:Windows目录下,将.erlang.cookie文件,拷贝到用户目录下C:\User\{用户名},
这是Erlang的Cookie文件,允许Erlang进行交互。
我们可以使用rabbitmqctl list_users查看我们可以使用的用户,默认情况下只有administrator可以使用。
通常情况下我们需要新建一个用户给我们的应用程序使用。
rabbitmqctl add_user wcs 123456 //创建用户名为wcs密码为123456的用户
rabbitmqctl set_permissions wcs ".*" ".*" ".*" //授权给wcs用户所有权限
rabbitmqctl set_user_tags wcs administrator //分配用户组
rabbitmqctl change_password wcs 123 //修改wcs用户的密码为123
rabbitmqctl delete_user wcs //删除用户
也可以开启rabbitmq_management插件,在web界面查看和管理rabbitmq服务
rabbitmq-plugins enable rabbitmq_management
到这里为止,我们的服务已经搭建好了,接下来一个简单的示例看下在C#中如何使用rabbitmq。
1.发布者
var factory = new ConnectionFactory();
factory.HostName = "127.0.0.1";
factory.UserName = "wcs";
factory.Password = "123";
using (var connection = factory.CreateConnection())
{
using (var channel = connection.CreateModel())
{
//创建一个名称为hello的消息队列
channel.QueueDeclare(queue: "hello",//队列名,我们会向这个队列中发布一条消息,如果队列不存在则新建
durable: true,//是否持久化
exclusive: false,//true:排他性,该队列仅对首次申明它的连接可见,并在连接断开时自动删除
autoDelete: false,//true:如果该队列没有任何订阅的消费者的话,该队列会被自动删除
arguments: null);//如果安装了队列优先级插件则可以设置优先级
// 将消息标记为持久性。
var properties = channel.CreateBasicProperties();
properties.Persistent = true;
string message = JsonConvert.SerializeObject("你好");
var body = Encoding.UTF8.GetBytes(message);
channel.BasicPublish(exchange: "",//exchange名称
routingKey: "hello",//如果存在exchange,则消息被发送到名称为hello的queue的客户端
basicProperties: null,
body: body);//消息体
}
}
2.订阅者
1)创建与服务器之间的连接
var factory = new ConnectionFactory();
factory.HostName = "127.0.0.1";
factory.UserName = "wcs";
factory.Password = "123";
var connection = factory.CreateConnection();
var channel = connection.CreateModel();
channel.QueueDeclare(queue: "hello",
durable: true,
exclusive: false,
autoDelete: false,
arguments: null);
//输入1,那如果接收一个消息,但是没有应答,则客户端不会收到下一个消息
channel.BasicQos(0, 1, false);
2)从消息队列中订阅消息
var consumer = new EventingBasicConsumer(channel);
consumer.Received += (model, ea) =>
{
var body = ea.Body;
var message = Encoding.UTF8.GetString(body);//这里是我们订阅到的消息
// 手动发送消息确认信号。消息从队列中删除
channel.BasicAck(deliveryTag: ea.DeliveryTag, multiple: false);
}
channel.BasicConsume(rabbitmq_satusname, false, consumer);
这样我们就搭建了一个简单的发布订阅模式的MQ
RabbitMQ环境配置下载:
https://download.csdn.net/download/u010371458/10773073#0-qzone-1-48668-d020d2d2a4e8d1a374a433f596ad1440
附上自己写的一个简单的demo:
https://download.csdn.net/download/u010371458/10773140#0-qzone-1-80980-d020d2d2a4e8d1a374a433f596ad1440