MSMQ(微軟消息隊列)是Windows操做系統中消息應用程序的基礎,是用於建立分佈式、鬆散鏈接的消息通信應用程序的開發工具。消息隊列和電子郵件有着不少類似處,他們都包含多個屬性,用於保存消息,消息類型中都指出發送者和接收者的地址;然而他們的用處卻有着很大的區別:消息隊列的發送者和接收者是應用程序,而電子郵件的發送者和接收者一般是人。服務器
如同電子郵件同樣,消息隊列的發送和接收也不須要發送者和接收者同時在場,能夠存儲在消息隊列或是郵件服務器中。所以,咱們能夠用下圖來描述MSMQ應用程序的體系結構:分佈式
從上圖能夠看出,開發MSMQ應用程序並非十分困難的事情。不過要使用MSMQ開發你的消息處理程序,必須在開發系統和使用程序的主機上安裝消息隊列。消息隊列的安裝屬於Windows組件的安裝,和通常的組件安裝方法相似。安裝好消息隊列後,就能夠開發你本身的消息處理程序了。不過有一點須要注意,若是你的計算機處於工做組中,而不是某個域中,可能你的公用隊列不能使用,不過這並不影響你的程序開發。ide
消息處理程序不外乎消息的發送和接收,然而要收發消息,還必須引用一個隊列,一般咱們引用公用隊列和專用隊列,這兩個隊列都存放用戶生成的消息。引用隊列後,就能夠發送、接收和閱讀消息了。消息接收服務位於System.Messaging中,若是你找不到這一命名空間,你必須手動添加。點擊[項目]中的[添加引用],按下瀏覽按鈕,找到System.Messaging.dll文件,添加進來便可。函數
引用隊列工具
引用隊列有三種方法,經過路徑、格式名和標籤引用隊列,這裏我只介紹最簡單和最經常使用的方法:經過路徑應用隊列。隊列路徑的形式爲 machinename/queuename。指向隊列的路徑老是惟一的。下表列出用於每種類型的隊列的路徑信息:開發工具
隊列類型spa |
路徑中使用的語法操作系統 |
公共隊列.net |
MachineName/QueueName日誌 |
專用隊列 |
MachineName/Private$/QueueName |
日誌隊列 |
MachineName/QueueName/Journal$ |
若是是發送到本機上,還可使用」.」表明本機名稱。具體的引用方法經過Path屬性來進行,也能夠在初始化消息隊列時進行。
若是在初始化時引用消息隊列,那麼消息隊列必須存在於系統中,不然會產生中斷。往系統中添加隊列十分的簡單,打開[控制面板]中的[計算機管理],展開[服務和應用程序],找到並展開[消息隊列](若是找不到,說明你尚未安裝消息隊列),右擊但願添加的消息隊列的類別,選擇新建隊列便可。固然,在程序中也能夠實現消息隊列的建立,下文會有相應的說明。在初始化時引用消息隊列的代碼很簡單,以下所示:
MessageQueue Mq=new MessageQueue(「.//private$//jiang」);
經過Path屬性引用消息隊列的代碼也十分簡單:
MessageQueue Mq=new MessageQueue();
Mq.Path=」.//private$//jiang」;
使用 Create方法能夠在計算機上建立隊列:
System.Messaging.MessageQueue.Create(@"./private$/jiang");
發送消息
隊列引用事後,就能夠發送消息了。消息的發送能夠分爲簡單消息和複雜消息,簡單消息類型就是經常使用的數據類型,例如整型、字符串等數據;複雜消息的數據類型一般對應於系統中的複雜數據類型,例如結構,對象等等。
簡單消息的發送示例以下:
Mq.Send(1000); //發送整型數據
Mq.Send(「This is a test message!」); //發送字符串
複雜消息的發送和簡單消息的發送大同小異,只是發送時,一般不是直接給出發送的消息內容,而是表明發送消息內容的變量。下面的代碼分別經過消息變量和複雜數據類型變量發送一條複雜消息。
//下面的代碼中發送的消息由消息變量表示
Message Msg;
Msg=new Message(「A Complex Message!」);
Msg.Label=」This is the label」;
Msg.Priority=MessagePriority.High;
Mq.Send(Msg);
//下面的代碼中發送的消息由複雜數據類型變量表示,Customer爲自定義的一個類
Customer customer = new Customer();
customer.LastName = "Copernicus";
customer.FirstName = "Nicolaus";
Mq.Send(customer);
接收消息
接收消息相比發送消息要複雜一點。接收消息由兩種方式:經過Receive方法接收消息同時永久性地從隊列中刪除消息;經過Peek方法從隊列中取出消息而不從隊列中移除該消息。若是知道消息的標識符(ID),還能夠經過ReceiveById方法和PeekById方法完成相應的操做。
接收消息的代碼很簡單:
Mq.Receive(); //或Mq.ReceiveById(ID);
Mq.Peek(); // 或Mq.PeekById(ID);
閱讀消息
接收到的消息只有可以讀出來纔是有用的消息,所以接收到消息之後還必須能讀出消息,而讀出消息算是最複雜的一部操做了。在應用程序可以閱讀的消息和消息隊列中的消息格式不一樣,於是應用程序發送出去的消息通過序列化之後才發送給了消息隊列,這一過程由系統自動完成了,程序開發人員沒必要爲此編寫代碼,然而在接收到消息後就面臨着消息序列化的問題。
消息的序列化能夠經過Visual Studio 和 .NET Framework 附帶的三個預約義的格式化程序來完成:XMLMessageFormatter對象( MessageQueue組件的默認格式化程序設置)、BinaryMessageFormatter對象、ActiveXMessageFormatter對象。因爲後二者格式化後的消息一般不能爲人閱讀,因此咱們常常用到的是XMLMessageFormatter對象。
使用XMLMessageFormatter對象格式化消息的代碼以下所示:
string[] types = { "System.String" };
((XmlMessageFormatter)mq.Formatter).TargetTypeNames = types;
Message m=mq.Receive(new TimeSpan(0,0,3));
將接收到的消息傳送給消息變量之後,經過消息變量m的Body屬性就能夠讀出消息了:
MessageBox.Show((string)m.Body);
關閉消息隊列
消息隊列的關閉很簡單,和其餘對象同樣,經過Close函數就能夠實現了:
Mq.Close();
到此爲止,MSMQ應用程序的基礎知識就介紹徹底了,可是開發出一個功能強大的MSMQ應用程序顯然不是這麼簡單,要了解更詳細的資料能夠參考MSDN和Windows操做系統中關於消息隊列的幫助內容。