本來項目中使用的是msmq,后來看到一篇文章,有人比較了一下幾種消息隊列的性能,rabbitmq的性能要高於msmq,並且相對成熟。於是准備把項目中的消息隊列換一下。這里寫篇文章只為記錄rabbitmq的安裝、配置以及使用。方便以后自己查看,也算是留個記錄。
安裝
在windows下面安裝rabbitmq很簡單,先到rabbitmq的官方網站http://www.rabbitmq.com/去下載最新版即可。安裝過程中可能會提醒你安裝Erlang,按照提示會跳轉到對應的下載頁面,下載進行安裝就行了。這里基本上就是一路next就可以的,不過需要注意的是,在安裝的時候需要使用管理員身份進行安裝,否則rabbitmq的在線管理工具是無法啟用的。
配置
裝好之后還是有一個配置文件需要設置一下的,位置是在%HOMEPATH%\AppData\Roaming\RabbitMQ,你會看到下面已經有一個rabbitmq.config.example文件,不過還需要新建一個rabbitmq.config文件。配置內容可參考
[
{rabbit,
[
{loopback_users, [<<"guest">>]},
{tcp_listeners, [{"127.0.0.1", 5672}]}
]}
].
loopback_users:設置只能在與RabbitMq服務同一台機器上訪問服務的用戶。
tcp_listeners:設置RabbitMQ監聽的IP地址與端口。只監聽局域網內網iP、修改默認端口,防止被入侵攻擊。
設置完后,別忘記了以下操作,否則配置不起作用。
- 停止RabbitMQ服務;
- 重新安裝服務使配置生效:rabbitmq-service.bat install
- 不過這樣設置之后只能在本地訪問消息隊列,要想可以遠程訪問,還需要設置一下。設置方法為,
新建立了一個系統用戶
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
- 啟動RabbitMQ服務;
查看消息隊列
1、官方提供的一個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()); } } }