原本项目中使用的是msmq,后来看到一篇文章,有人比较了一下几种消息队列的性能,rabbitmq的性能要高于msmq,而且相对成熟。因而准备把项目中的消息队列换一下。这里写篇文章只为记录rabbitmq的安装、配置以及使用。方便之后本身查看,也算是留个记录。html
安装web
在windows下面安装rabbitmq很简单,先到rabbitmq的官方网站http://www.rabbitmq.com/去下载最新版便可。安装过程当中可能会提醒你安装Erlang,按照提示会跳转到对应的下载页面,下载进行安装就好了。这里基本上就是一路next就能够的,不过须要注意的是,在安装的时候须要使用管理员身份进行安装,不然rabbitmq的在线管理工具是没法启用的。json
配置windows
装好以后仍是有一个配置文件须要设置一下的,位置是在%HOMEPATH%\AppData\Roaming\RabbitMQ,你会看到下面已经有一个rabbitmq.config.example文件,不过还须要新建一个rabbitmq.config文件。配置内容可参考浏览器
[
{rabbit,
[
{loopback_users, [<<"guest">>]},
{tcp_listeners, [{"127.0.0.1", 5672}]}bash
]}
].tcp
loopback_users:设置只能在与RabbitMq服务同一台机器上访问服务的用户。函数
tcp_listeners:设置RabbitMQ监听的IP地址与端口。只监听局域网内网iP、修改默认端口,防止被入侵攻击。工具
设置完后,别忘记了如下操做,不然配置不起做用。oop
新创建了一个系统用户rabbit(名称本身取)
,而后授予全部权限,使用下面的命令:
rabbitmqctl add_user rabbit 123456
rabbitmqctl set_user_tags rabbitadministrator rabbitmqctl set_permissions -p / rabbit ".*" ".*" ".*"
以上命令要切换到rabbitmq的安装目录下的sbin路径,例如D:\Program Files\RabbitMQ Server\rabbitmq_server-3.4.0\sbin
查看消息队列
一、官方提供的一个web管理工具(rabbitmq_management)
var factory = new ConnectionFactory() { HostName = "192.168.5.199", UserName = "rabbit", Password = "123456" }; using (var connection = factory.CreateConnection()) { //rabbitmq服务端 using (IModel channel = connection.CreateModel()) { //在MQ上定义一个持久化队列,若是名称相同不会重复建立 channel.QueueDeclare("TestQueue", true, false, false, null); //输入1,那若是接收一个消息,可是没有应答,则客户端不会收到下一个消息 channel.BasicQos(0, 1, false); //在队列上定义一个消费者 var consumer = new QueueingBasicConsumer(channel); //消费队列,并设置应答模式为程序主动应答 channel.BasicConsume("TestQueue", false, consumer); while (true) { //阻塞函数,获取队列中的消息 var ea = (BasicDeliverEventArgs)consumer.Queue.Dequeue(); byte[] bytes = ea.Body; string str = Encoding.UTF8.GetString(bytes); var msg = JsonConvert.DeserializeObject<RequestMsg>(str); Console.WriteLine("HandleMsg:" + msg.Name.ToString()); //回复确认 channel.BasicAck(ea.DeliveryTag, false); } } }
var factory = new ConnectionFactory() { HostName = "192.168.5.199", UserName = "rabbit", Password = "123456" }; //rabbitmq客户端 using (var channel = connection.CreateModel()) { channel.QueueDeclare("PosQueue", true, false, false, null); while (true) { var requestMsg = new RequestMsg(); requestMsg.Name = string.Format("Name_{0}", "ccc"); requestMsg.Code = string.Format("Code_{0}", "eee"); string jsonStr = JsonConvert.SerializeObject(requestMsg); byte[] bytes = Encoding.UTF8.GetBytes(jsonStr); //设置消息持久化 IBasicProperties properties = channel.CreateBasicProperties(); properties.DeliveryMode = 2; channel.BasicPublish("", "PosQueue", properties, bytes); Console.WriteLine("消息已发送:" + requestMsg.ToString()); } } }