MSMQ(MicroSoft Message Queue,微軟消息隊列)是在多個不一樣的應用之間實現相互通訊的一種異步傳輸模式,相互通訊的應用能夠分佈於同一臺機器上,也能夠分佈於相連的網絡空間中的任一位置。它的實現原理是:消息的發送者把本身想要發送的信息放入一個容器中(咱們稱之爲Message),而後把它保存至一個系統公用空間的消息隊列(Message Queue)中;本地或者是異地的消息接收程序再從該隊列中取出發給它的消息進行處理。
在消息傳遞機制中,有兩個比較重要的概念。一個是消息,一個是隊列。消息是由通訊的雙方所須要傳遞的信息,它能夠是各式各樣的媒體,如文本、聲音、圖象等等。消息最終的理解方式,爲消息傳遞的雙方事先商定,這樣作的好處是,一是至關於對數據進行了簡單的加密,二則採用本身定義的格式能夠節省通訊的傳遞量。消息能夠含有發送和接收者的標識,這樣只有指定的用戶才能看到只傳遞給他的信息和返回是否操做成功的回執。消息也能夠含有時間戳,以便於接收方對某些與時間相關的應用進行處理。消息還能夠含有到期時間,它代表若是在指定時間內消息還未到達則做廢,這主要應用與時間性關聯較爲緊密的應用。
消息隊列是發送和接收消息的公用存儲空間,它能夠存在於內存中或者是物理文件中。消息能夠以兩種方式發送,即快遞方式(express)和可恢復模式(recoverable),它們的區別在於,快遞方式爲了消息的快速傳遞,把消息放置於內存中,而不放於物理磁盤上,以獲取較高的處理能力;可恢復模式在傳送過程的每一步驟中,都把消息寫入物理磁盤中,以獲得較好的故障恢復能力。消息隊列能夠放置在發送方、接收方所在的機器上,也能夠單獨放置在另一臺機器上。正是因爲消息隊列在放置方式上的靈活性,造成了消息傳送機制的可靠性。當保存消息隊列的機器發生故障而從新啓動之後,以可恢復模式發送的消息能夠恢復到故障發生以前的狀態,而以快遞方式發送的消息則丟失了。另外一方面,採用消息傳遞機制,發送方必要再擔憂接收方是否啓動、是否發生故障等等非必要因素,只要消息成功發送出去,就能夠認爲處理完成,而實際上對方可能甚至不曾開機,或者實際完成交易時可能已是次日了。
採用MSMQ帶來的好處是:因爲是異步通訊,不管是發送方仍是接收方都不用等待對方返回成功消息,就能夠執行餘下的代碼,於是大大地提升了事物處理的能力;當信息傳送過程當中,信息發送機制具備必定功能的故障恢復能力;MSMQ的消息傳遞機制使得消息通訊的雙方具備不一樣的物理平臺成爲可能。
在微軟的.net平臺上利用其提供的MSMQ功能,能夠輕鬆建立或者刪除消息隊列、發送或者接收消息、甚至於對消息隊列進行管理。
在.NET產品中,提供了一個MSMQ類庫"System.Messaging.dll"。它提供了兩個類分別對消息對象和消息隊列對象進行操做。在可以使用MSMQ功能以前,你必須肯定你的機器上安裝了MSMQ消息隊列組件,並確保服務正在運行中。在使用ASP.NET編程時,應在頭部使用:
<%@ Assembly Name="System.Messaging"%>
<%@ Import NameSpace="System.Messsaging"%>
將MSMQ類庫引入ASP.NET文件
1. 對消息隊列的建立
dim MsgQue as MessageQueue
MsgQue=New MessageQueue(MsgPath)
其中:MsgPath能夠爲本地私有隊列,如"./MyQueue",也能夠爲其餘機器的公有隊列,如"Saidy/777$/MyQueue",Saidy爲另外一機器名。
2. 消息的發送
dim MsgQue as MessageQueue
MsgQue.Send(Msg)
其中:Msg爲任一對象。
3. 消息的接收
消息的接收又分紅同步和異步方式兩種,同步接收在規定時間內從消息隊列中取出收到的第一條消息,當消息隊列中沒有消息時,程序處於等待狀態;異步接收方式則是定義了一個事件處理函數,當消息隊列中第一個消息到達時當即觸發該函數。
1) 同步方式
dim Msg as Message
dim Fmt As XmlMessageFormatter
Fmt= CType(MsgQue.Formatter,XmlMessageFormatter)
Fmt.TargetTypeNames = new String(){"System.String"}
Msg=MsgQue.receive(New TimeSpan(0,0,3))
首先定義收到消息應轉換成的格式,而後在指定時間內去接收消息
2) 異步方式
dim Fmt As XmlMessageFormatter
''定義接收消息類型
Fmt = CType(MsgQue.Formatter,XmlMessageFormatter)
Fmt.TargetTypeNames = new String(){"System.String"}
''定義消息處理函數入口
AddHandler MsgQue.ReceiveCompleted, New ReceiveCompletedEventHandler
(AddressOf OnReceiveCompleted)
''定義消息處理函數
Public Shared Sub OnReceiveCompleted(s As Object, asyncResult As ReceiveAsyncEventArgs)
Dim MsgQue As MessageQueue = CType(s,MessageQueue)
Dim Msg As Message = MsgQue.EndReceive(asyncResult.AsyncResult)
''此時Msg.Body即爲所取消息對象
MsgQue.BeginReceive()
''從新定義異步接收方式
End sub
''啓動異步接收方式
MsgQue.BeginReceive
消息隊列配置屬性
關於隊列的屬性
path屬性:它能夠決定引用隊列的三種方式,路徑引用、格式名引用、標識引用
category屬性:標識當前使用的隊列的類型。Category是隊列全部者定義的GUID值。該GUID值能夠有GUID生成工具產生或者是用戶自定義的數字值。GUID值不會惟一,這樣才能夠根據相同的GUID值,把多個消息隊列劃分爲不一樣的類別(category)。
跟發送數據類型相關的屬性
Formatter屬性:決定在一個隊列中如何發送和接收消息的順序,以及能夠在一個消息中發送什麼樣的內容。
和隊列交互相關的屬性
DenyShareReceive屬性:決定同一時間內只有一個部件可以訪問消息隊列中的消息。
CanRead和CanWrite屬性:決定隊列是否能夠被讀取或者是寫入。
MaximumQueueSize和MaximumJournalSize屬性:以千字節爲單位設置一個隊列(日誌隊列)的消息最大容納量。一旦接收的消息到達這個容量,新的消息將再也不被接收。
通常狀況下,消息隊列的最大值爲消息隊列管理員所設置,若是這個值沒有控制的話,那麼缺省的消息隊列最大容量將是無限制的。
UseJournalQueue屬性::設置是否將收到的消息拷貝到日誌消息隊列中去。 express