MicroSoft Message Queuing
(微軟消息隊列)是在多個不一樣的應用之間實現相互通訊的一種異步傳輸模式
,相互通訊的應用能夠分佈於同一臺機器上,也能夠分佈於相連的網絡空間中的任一位置。它的實現原理是:消息的發送者把本身想要發送的信息放入一個容器中(咱們稱之爲Message),而後把它保存至一個系統公用空間的消息隊列(Message Queue)
中;本地或者是異地的消息接收程序再從該隊列中取出發給它的消息進行處理。html
在消息傳遞機制
中,有兩個比較重要的概念。一個是消息
,一個是隊列
。消息是由通訊的雙方所須要傳遞的信息,它能夠是各式各樣的媒體,如文本、聲音、圖象等等。消息最終的理解方式,爲消息傳遞的雙方事先商定,這樣作的好處是,一是至關於對數據進行了簡單的加密,二則採用本身定義的格式能夠節省通訊的傳遞量。消息能夠含有發送和接收者的標識,這樣只有指定的用戶才能看到只傳遞給他的信息和返回是否操做成功的回執。消息也能夠含有時間戳,以便於接收方對某些與時間相關的應用進行處理。消息還能夠含有到期時間,它代表若是在指定時間內消息還未到達則做廢,這主要應用與時間性關聯較爲緊密的應用。express
消息隊列是發送和接收消息的公用存儲空間
,它能夠存在於內存中
或者是物理文件中
。消息能夠以兩種方式發送,即快遞方式(express)
和可恢復模式(recoverable)
,它們的區別在於,快遞方式爲了消息的快速傳遞,把消息放置於內存中,而不放於物理磁盤上,以獲取較高的處理能力;可恢復模式在傳送過程的每一步驟中,都把消息寫入物理磁盤中,以獲得較好的故障恢復能力。消息隊列能夠放置在發送方、接收方所在的機器上,也能夠單獨放置在另一臺機器上。正是因爲消息隊列在放置方式上的靈活性,造成了消息傳送機制的可靠性。當保存消息隊列的機器發生故障而從新啓動之後,以可恢復模式發送的消息能夠恢復到故障發生以前的狀態,而以快遞方式發送的消息則丟失了。另外一方面,採用消息傳遞機制,發送方沒必要要再擔憂接收方是否啓動、是否發生故障等等非必要因素,只要消息成功發送出去,就能夠認爲處理完成,而實際上對方可能甚至不曾開機,或者實際完成交易時可能已是次日了安全
採用MSMQ帶來的好處是:因爲是異步通訊
,不管是發送方仍是接收方都不用等待對方返回成功消息,就能夠執行餘下的代碼,於是大大地提升了事物處理的能力;當信息傳送過程當中,信息發送機制具備必定功能的故障恢復能力;MSMQ的消息傳遞機制使得消息通訊的雙方具備不一樣的物理平臺成爲可能。服務器
在微軟的.net平臺上利用其提供的MSMQ功能,能夠輕鬆建立或者刪除消息隊列、發送或者接收消息、甚至於對消息隊列進行管理。網絡
在Net操做MSMQ 咱們得使用MessageQueue
類(它在system.messaging.dll這個程序集中),經過它提供的API來管理MSMQ隊列.異步
建立隊列,path表明隊列的路徑,transactional表示是否建立事務隊列,默認爲fasle。工具
public static MessageQueue Create(string path);
public static MessageQueue Create(string path, bool transactional);
驗證指定路徑的隊列是否存在,path表明隊列的路徑,表現形式爲"主機名\隊列名稱"。ui
例如:".\private$\myQueue",其中".「表明本地主機,」\private$\myQueue"則表明隊列的名稱,"private$"表示咱們建立的是專用隊列,在網絡上咱們能夠經過路徑來惟一肯定一個隊列。加密
public static bool Exists(string path);
刪除隊列,path表明隊列的路徑。操作系統
public static void Delete(string path);
發送消息到MSMQ。obj表明咱們的用戶數據,transation表示將咱們的發送操做歸入事務當中。
在前面咱們說過MSMQ接收的是Message,可是在這裏咱們看到Send操做並未強制要求咱們採用Message類型參數。這是由於當我傳入一個Object參數數據時,在Send操做的內部自動的給咱們建立了一個Message消息對象,而且將咱們的傳入的Object參數採用默認的序列化器序列化,而後裝入Message的body屬性當中,若是咱們在Send方法中指定label屬性,它將被賦值給Message的同名Label屬性。固然咱們徹底能夠自定義一個message對象傳入Send方法中
public void Send(object obj);
public void Send(object obj, MessageQueueTransaction transaction);
public void Send(object obj, string label);
若是咱們在接收消息的後,不想把MSMQ隊列中的消息刪除怎麼辦呢?那麼採用下面的方法吧,由於這兩個方法接收MSMQ的消息,不會刪除MSMQ中對應的消息,因此他們不支持事務,即沒有提供事務的參數。
public Message Peek();
若是咱們想取指定標識的消息,就的採用以下的方法了,id表明消息的惟一標示
public Message PeekById(string id);
採用Receive方式在取MSMQ的消息時,若是成功,會把MSMQ的對應消息給刪除掉,而且只能取到消息隊裏中的排隊頭的消息。
public Message Receive();
public Message Receive(MessageQueueTransaction transaction);
public Message Receive(TimeSpan timeout);
若是咱們想取指定標識的消息,就的採用以下的方法了,id表明消息的惟一標示。
public Message ReceiveById(string id);
public Message ReceiveById(string id, MessageQueueTransaction transaction);
咱們可使用GetAllMessages一次性把隊列裏面的全部消息取出來
public Message[] GetAllMessages();
本次將使用win10系統自帶的MSMQ進行演練,首先若是你使用的是Windows操做系統(不論是Windows Server、Windows Vista仍是Windows 10,Windows 7,Windows 8等)均可以在無需下載的狀況下安裝微軟提供MSMQ服務,相信不少微軟用戶對此比較熟悉。
打開 控制面板>程序>程序和功能>啓動或關閉Windows功能
選擇 MicroSoft Message Queue(MSMQ)服務器
點擊肯定等待安裝完成
打開 控制面板>系統和安全>管理工具>計算機管理
咱們能夠看到在服務和應用程序中有一個消息隊列
,打開消息隊列咱們能夠看到服務自己爲咱們提供了3中隊列(傳出隊列、專用隊列、系統隊列)。
在上面的三種隊列中,用戶能自由建立的只有專用隊列,下面演示建立一個專用隊列。
相關