最近項目用到消息隊列,找資料學習了下。把學習的結果 分享出來服務器
首先說一下,消息隊列 (MSMQ Microsoft Message Queuing)是MS提供的服務,也就是Windows操做系統的功能,並非.Net提供的。網絡
MSDN上的解釋以下:架構
Message Queuing (MSMQ) technology enables applications running at different times to communicate across heterogeneous networks and systems that may be temporarily offline.app
Applications send messages to queues and read messages from queues.學習
The following illustration shows how a queue can hold messages that are generated by multiple sending applications and read by multiple receiving applications.ui
消息隊列(MSMQ)技術使得運行於不一樣時間的應用程序可以在各類各樣的網絡和可能暫時脫機的系統之間進行通訊。spa
應用程序將消息發送到隊列,並從隊列中讀取消息。操作系統
下圖演示了消息隊列如何保存由多個發送應用程序生成的消息,並被多個接收應用程序讀取。3d
消息一旦發送到隊列中,便會一直存在,即便發送的應用程序已經關閉。code
MSMQ服務默認是關閉的,(Window7及以上操做系統)按如下方式打開
一、打開運行,輸入"OptionalFeatures",鉤上Microsoft Message Queue(MSMQ)服務器。
(Windows Server 2008R2及以上)按如下方式打開
二、打開運行,輸入"appwiz.cpl",在任務列表中選擇「打開或關閉Windows功能」
而後在"添加角色"中選擇消息隊列
消息隊列分爲如下幾種,每種隊列的路徑表示形式以下:
公用隊列 MachineName\QueueName
專用隊列 MachineName\Private$\QueueName
日記隊列 MachineName\QueueName\Journal$
計算機日記隊列 MachineName\Journal$
計算機死信隊列 MachineName\Deadletter$
計算機事務性死信隊列 MachineName\XactDeadletter$
這裏的MachineName能夠用 「."代替,表明當前計算機
須要先引用System.Messaging.dll
建立消息隊列
1 //消息隊列路徑 2 string path = ".\\Private$\\myQueue"; 3 MessageQueue queue; 4 //若是存在指定路徑的消息隊列 5 if(MessageQueue.Exists(path)) 6 { 7 //獲取這個消息隊列 8 queue = new MessageQueue(path); 9 } 10 else 11 { 12 //不存在,就建立一個新的,並獲取這個消息隊列對象 13 queue = MessageQueue.Create(path); 14 }
發送字符串消息
1 System.Messaging.Message msg = new System.Messaging.Message(); 2 //內容 3 msg.Body = "Hello World"; 4 //指定格式化程序 5 msg.Formatter = new XmlMessageFormatter(new Type[] { typeof(string) }); 6 queue.Send(msg);
發送消息的時候要指定格式化程序,若是不指定,格式化程序將默認爲XmlMessageFormatter(使用基於 XSD 架構定義的 XML 格式來接收和發送消息。)
接收字符串消息
1 //接收到的消息對象 2 System.Messaging.Message msg = queue.Receive(); 3 //指定格式化程序 4 msg.Formatter = new XmlMessageFormatter(new Type[] { typeof(string) }); 5 //接收到的內容 6 string str = msg.Body.ToString();
發送二進制消息(如圖像)
引用 System.Drawing.dll
1 System.Drawing.Image image = System.Drawing.Bitmap.FromFile("a.jpg"); 2 Message message = new Message(image, new BinaryMessageFormatter()); 3 queue.Send(message);
接收二進制消息
1 System.Messaging.Message message = queue.Receive(); 2 System.Drawing.Bitmap image= (System.Drawing.Bitmap)message.Body; 3 image.Save("a.jpg", System.Drawing.Imaging.ImageFormat.Jpeg);
獲取消息隊列的消息的數量
1 int num = queue.GetAllMessages().Length;
清空消息隊列
1 queue.Purge();
以圖形化的方式查看消息隊列中的消息
運行輸入 compmgmt.msc,打開計算機管理,選擇[服務和應用程序-消息隊列]。只要消息隊列中的消息沒有被接收,就能夠在這裏查看獲得。
示例程序: