使用MSMQ (轉)

amyz發表於2007-08-15
使用MSMQ (轉)[@more@] 
 
   MSMQ( Message Queue,訊息佇列)是在多個不同的應用之間實現相互通訊的一種非同步傳輸,相互通訊的應用可以分佈於同一臺機器上,也可以分佈於相連的空間中的任一位置。它的實現原理是:訊息的傳送者把自己想要傳送的資訊放入一個容器中(我們稱之為Message),然後把它儲存至一個公用空間的訊息佇列(Message Queue)中;本地或者是異地的訊息接收再從該佇列中取出發給它的訊息進行處理。
 
   在訊息傳遞機制中,有兩個比較重要的概念。一個是訊息,一個是佇列。訊息是由通訊的雙方所需要傳遞的資訊,它可以是各式各樣的,如文字、、圖象等等。訊息最終的理解方式,為訊息傳遞的雙方事先商定,這樣做的好處是,一是相當於對資料進行了簡單的,二則採用自己定義的格式可以節省通訊的傳遞量。訊息可以含有傳送和接收者的標識,這樣只有指定的才能看到只傳遞給他的資訊和返回是否操作成功的回執。訊息也可以含有時間戳,以便於接收方對某些與時間相關的應用進行處理。訊息還可以含有到期時間,它表明如果在指定時間內訊息還未到達則作廢,這主要應用與時間性關聯較為緊密的應用。
 
   訊息佇列是傳送和接收訊息的公用空間,它可以存在於中或者是物理中。訊息可以以兩種方式傳送,即快遞方式(express)和可恢復模式(recoverable),它們的區別在於,快遞方式為了訊息的傳遞,把訊息放置於記憶體中,而不放於物理上,以獲取較高的處理能力;可恢復模式在傳送過程的每一步驟中,都把訊息寫入物理磁碟中,以得到較好的故障恢復能力。訊息佇列可以放置在傳送方、接收方所在的機器上,也可以單獨放置在另外一臺機器上。正是由於訊息佇列在放置方式上的靈活性,形成了訊息傳送機制的可靠性。當儲存訊息佇列的機器發生故障而重新啟動以後,以可恢復模式傳送的訊息可以恢復到故障發生之前的狀態,而以快遞方式傳送的訊息則丟失了。另一方面,採用訊息傳遞機制,傳送方必要再擔心接收方是否啟動、是否發生故障等等非必要因素,只要訊息成功傳送出去,就可以認為處理完成,而實際上對方可能甚至未曾開機,或者實際完成交易時可能已經是第二天了。
 
   採用MSMQ帶來的好處是:由於是非同步通訊,無論是傳送方還是接收方都不用等待對方返回成功訊息,就可以餘下的程式碼,因而大大地提高了事物處理的能力;當資訊傳送過程中,資訊傳送機制具有一定功能的故障恢復能力;MSMQ的訊息傳遞機制使得訊息通訊的雙方具有不同的物理平臺成為可能。
 
   在微軟的平臺上利用其提供的MSMQ功能,可以輕鬆建立或者刪除訊息佇列、傳送或者接收訊息、甚至於對訊息佇列進行管理。
 
   在.NET產品中,提供了一個MSMQ類庫"System.Messaging.dll"。它提供了兩個類分別對訊息和訊息佇列物件進行操作。在能夠使用MSMQ功能之前,你必須確定你的機器上了MSMQ訊息佇列,並確保服務正在執行中。在使用.NET時,應在頭部使用:
 
    <%@ Assembly Name="System.Messaging"%>
 
    <%@ Import NameSpace="System.Messsaging"%>
 
   將MSMQ類庫引入檔案
 
   1. 對訊息佇列的建立
 
    dim MsgQue as MessageQueue
 
    MsgQue=New MessageQueue(MsgPath)
 
 其中:MsgPath可以為本地私有佇列,如".MyQueue",也可以為其他機器的公有佇列,如"Saidy777$MyQueue",Saidy為另一機器名。
 
 
   2. 訊息的傳送
 
    dim MsgQue as MessageQueue
 
    MsgQue.Send(Msg)
 
    其中:Msg為任一物件。
 
   3. 訊息的接收
 
   訊息的接收又分成同步和非同步方式兩種,同步接收在規定時間內從訊息佇列中取出收到的第一條訊息,當訊息佇列中沒有訊息時,程式處於等待狀態;非同步接收方式則是定義了一個事件處理,當訊息佇列中第一個訊息到達時立即觸發該函式。
 
   1) 同步方式
 
    dim Msg as Message
 
   dim Fmt As MessageFormatter
 
   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 , 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屬性::設定是否將收到的訊息複製到日誌訊息佇列中去。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752019/viewspace-958460/,如需轉載,請註明出處,否則將追究法律責任。

相關文章