Message Queuing(MSMQ)

一、前言

MicroSoft Message Queuing(微軟消息隊列)是在多個不同的應用之間實現相互通信的一種異步傳輸模式,相互通信的應用可以分佈於同一臺機器上,也可以分佈於相連的網絡空間中的任一位置。它的實現原理是:消息的發送者把自己想要發送的信息放入一個容器中(我們稱之爲Message),然後把它保存至一個系統公用空間的消息隊列(Message Queue)中;本地或者是異地的消息接收程序再從該隊列中取出發給它的消息進行處理。

二、實質

消息傳遞機制中,有兩個比較重要的概念。一個是消息,一個是隊列。消息是由通信的雙方所需要傳遞的信息,它可以是各式各樣的媒體,如文本、聲音、圖象等等。消息最終的理解方式,爲消息傳遞的雙方事先商定,這樣做的好處是,一是相當於對數據進行了簡單的加密,二則採用自己定義的格式可以節省通信的傳遞量。消息可以含有發送和接收者的標識,這樣只有指定的用戶才能看到只傳遞給他的信息和返回是否操作成功的回執。消息也可以含有時間戳,以便於接收方對某些與時間相關的應用進行處理。消息還可以含有到期時間,它表明如果在指定時間內消息還未到達則作廢,這主要應用與時間性關聯較爲緊密的應用。

消息隊列是發送和接收消息的公用存儲空間,它可以存在於內存中或者是物理文件中。消息可以以兩種方式發送,即快遞方式(express)可恢復模式(recoverable),它們的區別在於,快遞方式爲了消息的快速傳遞,把消息放置於內存中,而不放於物理磁盤上,以獲取較高的處理能力;可恢復模式在傳送過程的每一步驟中,都把消息寫入物理磁盤中,以得到較好的故障恢復能力。消息隊列可以放置在發送方、接收方所在的機器上,也可以單獨放置在另外一臺機器上。正是由於消息隊列在放置方式上的靈活性,形成了消息傳送機制的可靠性。當保存消息隊列的機器發生故障而重新啓動以後,以可恢復模式發送的消息可以恢復到故障發生之前的狀態,而以快遞方式發送的消息則丟失了。另一方面,採用消息傳遞機制,發送方不必要再擔心接收方是否啓動、是否發生故障等等非必要因素,只要消息成功發送出去,就可以認爲處理完成,而實際上對方可能甚至未曾開機,或者實際完成交易時可能已經是第二天了

三、作用

採用MSMQ帶來的好處是:由於是異步通信,無論是發送方還是接收方都不用等待對方返回成功消息,就可以執行餘下的代碼,因而大大地提高了事物處理的能力;當信息傳送過程中,信息發送機制具有一定功能的故障恢復能力;MSMQ的消息傳遞機制使得消息通信的雙方具有不同的物理平臺成爲可能。

在微軟的.net平臺上利用其提供的MSMQ功能,可以輕鬆創建或者刪除消息隊列、發送或者接收消息、甚至於對消息隊列進行管理。

四、MSMQ API

在Net操作MSMQ 我們得使用MessageQueue類(它在system.messaging.dll這個程序集中),通過它提供的API來管理MSMQ隊列.

1.創建隊列

創建隊列,path代表隊列的路徑,transactional表示是否創建事務隊列,默認爲fasle。

public static MessageQueue Create(string path);
public static MessageQueue Create(string path, bool transactional);

2.驗證隊列

驗證指定路徑的隊列是否存在,path代表隊列的路徑,表現形式爲"主機名\隊列名稱"。

例如:".\private$\myQueue",其中".“代表本地主機,”\private$\myQueue"則代表隊列的名稱,"private$"表示我們創建的是專用隊列,在網絡上我們可以通過路徑來唯一確定一個隊列。

public static bool Exists(string path);

3.刪除隊列

刪除隊列,path代表隊列的路徑。

public static void Delete(string path);

4.發送消息

發送消息到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);

5.接受隊列(Peek方式)

如果我們在接收消息的後,不想把MSMQ隊列中的消息刪除怎麼辦呢?那麼採用下面的方法吧,因爲這兩個方法接收MSMQ的消息,不會刪除MSMQ中對應的消息,所以他們不支持事務,即沒有提供事務的參數。

public Message Peek();

如果我們想取指定標識的消息,就的採用如下的方法了,id代表消息的唯一標示

public Message PeekById(string id);

6.接受隊列(Receive方式)

採用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);

7.接受隊列(接受全部)

我們可以使用GetAllMessages一次性把隊列裏面的所有消息取出來

public Message[] GetAllMessages();

五、MSMQ的安裝

本次將使用win10系統自帶的MSMQ進行演練,首先如果你使用的是Windows操作系統(不管是Windows Server、Windows Vista還是Windows 10,Windows 7,Windows 8等)都可以在無需下載的情況下安裝微軟提供MSMQ服務,相信很多微軟用戶對此比較熟悉。

1.開啓MSMQ功能

打開 控制面板>程序>程序和功能>啓動或關閉Windows功能

選擇 MicroSoft Message Queue(MSMQ)服務器

image

點擊確定等待安裝完成

2.查看消息隊列

打開 控制面板>系統和安全>管理工具>計算機管理

我們可以看到在服務和應用程序中有一個消息隊列,打開消息隊列我們可以看到服務本身爲我們提供了3中隊列(傳出隊列、專用隊列、系統隊列)。

image

3.手動創建隊列

在上面的三種隊列中,用戶能自由創建的只有專用隊列,下面演示創建一個專用隊列。

image

image

image

參考:MessageQueue Class

相關

Message Queuing(MSMQ)演練

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章