原本項目中使用的是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()); } } }