消息隊(duì)列(Message Queue)簡(jiǎn)介及其使用_第1頁(yè)
消息隊(duì)列(Message Queue)簡(jiǎn)介及其使用_第2頁(yè)
消息隊(duì)列(Message Queue)簡(jiǎn)介及其使用_第3頁(yè)
消息隊(duì)列(Message Queue)簡(jiǎn)介及其使用_第4頁(yè)
消息隊(duì)列(Message Queue)簡(jiǎn)介及其使用_第5頁(yè)
已閱讀5頁(yè),還剩15頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、消息隊(duì)列(Message Queue)簡(jiǎn)介及其使用利用 MSMQ(Microsoft Message Queue),應(yīng)用程序開發(fā)人員可以通過(guò)發(fā)送和接收消息方便地與應(yīng)用程序進(jìn)行快速可靠的通信。消息處理為您提供了有保障的消息傳遞和執(zhí)行許多業(yè)務(wù)處理的可靠的防故障方法。MSMQ與XML Web Services和.Net Remoting一樣,是一種分布式開發(fā)技術(shù)。但是在使用XML Web Services或.Net Remoting組件時(shí),Client端需要和Server端實(shí)時(shí)交換信息,Server需要保持聯(lián)機(jī)。MSMQ則可以在Server離線的情況下工作,將Message臨時(shí)保存在Client端的

2、消息隊(duì)列中,以后聯(lián)機(jī)時(shí)再發(fā)送到Server端處理。顯然,MSMQ不適合于Client需要Server端及時(shí)響應(yīng)的這種情況,MSMQ以異步的方式和Server端交互,不用擔(dān)心等待Server端的長(zhǎng)時(shí)間處理過(guò)程。 雖然XML Web Services和.Net Remoting都提供了OneWay屬性來(lái)處理異步調(diào)用,用來(lái)解決Server端長(zhǎng)方法調(diào)用長(zhǎng)時(shí)間阻礙Client端。但是不能解決大量Client負(fù)載的問題,此時(shí)Server接受的請(qǐng)求快于處理請(qǐng)求。一般情況下,OneWay屬性不用于專門的消息服務(wù)中。 1. 基本術(shù)語(yǔ)和概念(Basic terms and concepts)“

3、消息”是在兩臺(tái)計(jì)算機(jī)間傳送的數(shù)據(jù)單位。消息可以非常簡(jiǎn)單,例如只包含文本字符串;也可以更復(fù)雜,可能包含嵌入對(duì)象。 消息被發(fā)送到隊(duì)列中。“消息隊(duì)列”是在消息的傳輸過(guò)程中保存消息的容器。消息隊(duì)列管理器在將消息從它的源中繼到它的目標(biāo)時(shí)充當(dāng)中間人。隊(duì)列的主要目的是提供路由并保證消息的傳遞;如果發(fā)送消息時(shí)接收者不可用,消息隊(duì)列會(huì)保留消息,直到可以成功地傳遞它。 “消息隊(duì)列”是 Microsoft 的消息處理技術(shù),它在任何安裝了 Microsoft Windows 的計(jì)算機(jī)組合中,為任何應(yīng)用程序提供消息處理和消息隊(duì)列功能,無(wú)論這些計(jì)算機(jī)是否在同一個(gè)網(wǎng)絡(luò)上或者是否同時(shí)聯(lián)機(jī)。 “消

4、息隊(duì)列網(wǎng)絡(luò)”是能夠相互間來(lái)回發(fā)送消息的任何一組計(jì)算機(jī)。網(wǎng)絡(luò)中的不同計(jì)算機(jī)在確保消息順利處理的過(guò)程中扮演不同的角色。它們中有些提供路由信息以確定如何發(fā)送消息,有些保存整個(gè)網(wǎng)絡(luò)的重要信息,而有些只是發(fā)送和接收消息。 “消息隊(duì)列”安裝期間,管理員確定哪些服務(wù)器可以互相通信,并設(shè)置特定服務(wù)器的特殊角色。構(gòu)成此“消息隊(duì)列”網(wǎng)絡(luò)的計(jì)算機(jī)稱為“站點(diǎn)”,它們之間通過(guò)“站點(diǎn)鏈接”相互連接。每個(gè)站點(diǎn)鏈接都有一個(gè)關(guān)聯(lián)的“開銷”,它由管理員確定,指示了經(jīng)過(guò)此站點(diǎn)鏈接傳遞消息的頻率。 “消息隊(duì)列”管理員還在網(wǎng)絡(luò)中設(shè)置一臺(tái)或多臺(tái)作為“路由服務(wù)器”的計(jì)算機(jī)。路由服務(wù)器查看各站點(diǎn)鏈接的開銷,確定經(jīng)過(guò)多個(gè)站

5、點(diǎn)傳遞消息的最快和最有效的方法,以此決定如何傳遞消息。 2. 隊(duì)列類型(Queue Type)有兩種主要的隊(duì)列類型:由您或網(wǎng)絡(luò)中的其他用戶創(chuàng)建的隊(duì)列和系統(tǒng)隊(duì)列。用戶創(chuàng)建的隊(duì)列可能是以下任何一種隊(duì)列:“公共隊(duì)列”在整個(gè)“消息隊(duì)列”網(wǎng)絡(luò)中復(fù)制,并且有可能由網(wǎng)絡(luò)連接的所有站點(diǎn)訪問?!皩S藐?duì)列”不在整個(gè)網(wǎng)絡(luò)中發(fā)布。相反,它們僅在所駐留的本地計(jì)算機(jī)上可用。專用隊(duì)列只能由知道隊(duì)列的完整路徑名或標(biāo)簽的應(yīng)用程序訪問?!肮芾黻?duì)列”包含確認(rèn)在給定“消息隊(duì)列”網(wǎng)絡(luò)中發(fā)送的消息回執(zhí)的消息。指定希望 MessageQueue 組件使用的管理隊(duì)列(如果有的話)。“響應(yīng)隊(duì)列”包含目標(biāo)應(yīng)用程序接收到消息時(shí)返回給發(fā)送

6、應(yīng)用程序的響應(yīng)消息。指定希望 MessageQueue 組件使用的響應(yīng)隊(duì)列(如果有的話)。 系統(tǒng)生成的隊(duì)列一般分為以下幾類:“日記隊(duì)列”可選地存儲(chǔ)發(fā)送消息的副本和從隊(duì)列中移除的消息副本。每個(gè)“消息隊(duì)列”客戶端上的單個(gè)日記隊(duì)列存儲(chǔ)從該計(jì)算機(jī)發(fā)送的消息副本。在服務(wù)器上為每個(gè)隊(duì)列創(chuàng)建了一個(gè)單獨(dú)的日記隊(duì)列。此日記跟蹤從該隊(duì)列中移除的消息?!八佬抨?duì)列”存儲(chǔ)無(wú)法傳遞或已過(guò)期的消息的副本。如果過(guò)期或無(wú)法傳遞的消息是事務(wù)性消息,則被存儲(chǔ)在一種特殊的死信隊(duì)列中,稱為“事務(wù)性死信隊(duì)列”。死信存儲(chǔ)在過(guò)期消息所在的計(jì)算機(jī)上。有關(guān)超時(shí)期限和過(guò)期消息的更多信息,請(qǐng)參見默認(rèn)消息屬性?!皥?bào)告隊(duì)列”包含指示消息到達(dá)目

7、標(biāo)所經(jīng)過(guò)的路由的消息,還可以包含測(cè)試消息。每臺(tái)計(jì)算機(jī)上只能有一個(gè)報(bào)告隊(duì)列?!皩S孟到y(tǒng)隊(duì)列”是一系列存儲(chǔ)系統(tǒng)執(zhí)行消息處理操作所需的管理和通知消息的專用隊(duì)列。在應(yīng)用程序中進(jìn)行的大多數(shù)工作都涉及訪問公共隊(duì)列及其消息。但是,根據(jù)應(yīng)用程序的日記記錄、確認(rèn)和其他特殊處理需要,在日常操作中很可能要使用幾種不同的系統(tǒng)隊(duì)列。 3. 同步和異步通信(Synchronous VS. Asynchronous Communication)隊(duì)列通信天生就是異步的,因?yàn)閷⑾l(fā)送到隊(duì)列和從隊(duì)列中接收消息是在不同的進(jìn)程中完成的。另外,可以異步執(zhí)行接收操作,因?yàn)橐邮障⒌娜丝梢詫?duì)任何給定的隊(duì)列調(diào)用 BeginRe

8、ceive 方法,然后立即繼續(xù)其他任務(wù)而不用等待答復(fù)。這與人們所了解的“同步通信”截然不同。 在同步通信中,請(qǐng)求的發(fā)送方在執(zhí)行其他任務(wù)前,必須等待來(lái)自預(yù)定接收方的響應(yīng)。發(fā)送方等待的時(shí)間完全取決于接收方處理請(qǐng)求和發(fā)送響應(yīng)所用的時(shí)間。 4. 同消息隊(duì)列交互(Interacting with Message Queues)消息處理和消息為基于服務(wù)器的應(yīng)用程序組件之間的進(jìn)程間通信提供了強(qiáng)大靈活的機(jī)制。同組件間的直接調(diào)用相比,它們具有若干優(yōu)點(diǎn),其中包括: 穩(wěn)定性 組件失敗對(duì)消息的影響程度遠(yuǎn)遠(yuǎn)小于組件間的直接調(diào)用,因?yàn)橄⒋鎯?chǔ)在隊(duì)列中并一直留在那里,直到被適當(dāng)?shù)靥幚?。消息處理同事?wù)處理

9、相似,因?yàn)橄⑻幚硎怯斜WC的。 消息優(yōu)先級(jí) 更緊急或更重要的消息可在相對(duì)不重要的消息之前接收,因此可以為關(guān)鍵的應(yīng)用程序保證足夠的響應(yīng)時(shí)間。 脫機(jī)能力 發(fā)送消息時(shí),它們可被發(fā)送到臨時(shí)隊(duì)列中并一直留在那里,直到被成功地傳遞。當(dāng)因任何原因?qū)λ桕?duì)列的訪問不可用時(shí),用戶可以繼續(xù)執(zhí)行操作。同時(shí),其他操作可以繼續(xù)進(jìn)行,如同消息已經(jīng)得到了處理一樣,這是因?yàn)榫W(wǎng)絡(luò)連接恢復(fù)時(shí)消息傳遞是有保證的。 事務(wù)性消息處理 將多個(gè)相關(guān)消息耦合為單個(gè)事務(wù),確保消息按順序傳遞、只傳遞一次并且可以從它們的目標(biāo)隊(duì)列中被成功地檢索。如果出現(xiàn)任何錯(cuò)誤,將取消整個(gè)事務(wù)。 安全性 MessageQueue 組件基于的消息隊(duì)列技術(shù)使用 Win

10、dows 安全來(lái)保護(hù)訪問控制,提供審核,并對(duì)組件發(fā)送和接收的消息進(jìn)行加密和驗(yàn)證。 5. 在.Net環(huán)境下編寫簡(jiǎn)單的Message Queue程序(1)先安裝Message Queuing Services通過(guò)Control Panel,“Add/Remove Programs” “Add/Remove Windows Components”步驟安裝MSMQ。MSMQ可以安裝為工作組模式或域模式。如果安裝程序沒有找到一臺(tái)運(yùn)行提供目錄服務(wù)的消息隊(duì)列的服務(wù)器,則只可以安裝為工作組模式,此計(jì)算機(jī)上的“消息隊(duì)列”只支持創(chuàng)建專用隊(duì)列和創(chuàng)建與其他運(yùn)行“消息隊(duì)列”的計(jì)算機(jī)的直接連接。 (2

11、)配置MSMQ打開Computer Management Message Queuing,在Private Queues下創(chuàng)建MSMQDemo隊(duì)列 (3)編寫代碼簡(jiǎn)單演示MSMQ對(duì)象MessageQueue 類是“消息隊(duì)列”周圍的包裝。MessageQueue 類提供對(duì)“消息隊(duì)列”隊(duì)列的引用??梢栽?MessageQueue 構(gòu)造函數(shù)中指定一個(gè)連接到現(xiàn)有資源的路徑,或者可在服務(wù)器上創(chuàng)建新隊(duì)列。在調(diào)用 Send、Peek 或 Receive 之前,必須將 MessageQueue 類的新實(shí)例與某個(gè)現(xiàn)有隊(duì)列關(guān)聯(lián)。 MessageQueue 支持兩種類型的消息檢索:同步和異步。同

12、步的 Peek 和 Receive 方法使進(jìn)程線程用指定的間隔時(shí)間等待新消息到達(dá)隊(duì)列。異步的 BeginPeek 和 BeginReceive 方法允許主應(yīng)用程序任務(wù)在消息到達(dá)隊(duì)列之前,在單獨(dú)的線程中繼續(xù)執(zhí)行。這些方法通過(guò)使用回調(diào)對(duì)象和狀態(tài)對(duì)象進(jìn)行工作,以便在線程之間進(jìn)行信息通訊。/ Send Messageprivate void btnSendMessage_Click(object sender, System.EventArgs e)       / Open queue    

13、0;  System.Messaging.MessageQueue queue = new System.Messaging.MessageQueue(".Private$MSMQDemo");        / Create message       System.Messaging.Message message = new System.Messaging.Message();    &#

14、160;  message.Body = txtMessage.Text.Trim();       message.Formatter = new System.Messaging.XmlMessageFormatter(new Type typeof(string);        / Put message into queue       queue.Send(message); 

15、;/ Receive Messageprivate void btnReceiveMessage_Click(object sender, System.EventArgs e)       / Open queue       System.Messaging.MessageQueue queue = new System.Messaging.MessageQueue(".Private$MSMQDemo");   

16、0;    / Receive message, 同步的Receive方法阻塞當(dāng)前執(zhí)行線程,直到一個(gè)message可以得到       System.Messaging.Message message = queue.Receive();       message.Formatter = new System.Messaging.XmlMessageFormatter(new Type typeof(string);  &#

17、160;    txtReceiveMessage.Text = message.Body.ToString(); MSMQ是微軟消息隊(duì)列的英文縮寫。關(guān)于消息隊(duì)列的定義在網(wǎng)上有相關(guān)資料,這里不在過(guò)多的解釋。 一、MSMQ介紹和安裝消息隊(duì)列使用消息隊(duì)列的優(yōu)點(diǎn):穩(wěn)定、消息優(yōu)先級(jí)、脫機(jī)能力以及安全性。消息隊(duì)列分為用戶創(chuàng)建的隊(duì)列(專用隊(duì)列)和系統(tǒng)隊(duì)列,用戶隊(duì)列分為,。我是Windows XP,看下圖所示(myQueue為自己創(chuàng)建的消息隊(duì)列,msmqtriggersnotifiations為通用隊(duì)列):對(duì)消息隊(duì)列有了簡(jiǎn)單的了解后,使用MSMQ進(jìn)行軟件開發(fā)

18、需要安裝MSMQ,安裝完后就該進(jìn)入實(shí)際的開發(fā)階段。具體的安裝過(guò)程就是在控制面板里“添加/刪除程序”下“添加/刪除Windows組件”,完成添加就OK。安裝完成后就可以通過(guò)交互界添加新的消息隊(duì)列,詳細(xì)如下圖:出了上面這種交互界面來(lái)創(chuàng)建MSMQ外,也可以通過(guò)編程來(lái)完成,.NET框架里的MessageQueue類下有一靜態(tài)方法Create,用來(lái)完成消息隊(duì)列的創(chuàng)建,其定義如下: 1/  2/ 摘要:  3/    在指定的路徑中創(chuàng)建非事務(wù)性“消息隊(duì)列”隊(duì)列。  4/  5/ 參數(shù):  

19、;6/   path:  7/     要?jiǎng)?chuàng)建的隊(duì)列的路徑。  8/  9/ 返回結(jié)果: 10/     表示新隊(duì)列的 System.Messaging.MessageQueue。 11public static MessageQueue Create(string path); 12/ 13/ 摘要: 14/     

20、;在指定的路徑中創(chuàng)建事務(wù)性或非事務(wù)性“消息隊(duì)列”隊(duì)列。 15/ 16/ 參數(shù): 17/   transactional: 18/     如果創(chuàng)建事務(wù)性隊(duì)列,為 true;如果創(chuàng)建非事務(wù)性隊(duì)列,則為 false。 19/ 20/   path: 21/     要?jiǎng)?chuàng)建的隊(duì)列的路徑。 22/ 23/ 返回結(jié)果: 24/     表示新隊(duì)列的 

21、;System.Messaging.MessageQueue。 25public static MessageQueue Create(string path, bool transactional);實(shí)現(xiàn)消息隊(duì)列的創(chuàng)建簡(jiǎn)單代碼(C#),創(chuàng)建一個(gè)名為"myQueue"的非事務(wù)性"消息隊(duì)列",如下: MessageQueue.Create(".private$myQueue");         二

22、、創(chuàng)建、刪除和管理隊(duì)列在.NET環(huán)境下編寫Message Queue程序的前提就是需要先安裝MSMQ,本文之前已經(jīng)作了詳細(xì)的介紹。要開發(fā)MSMQ程序就必須學(xué)習(xí)一個(gè)很重要的類(MessageQueue), 該類位于名稱空間System.Messageing下。其中有幾個(gè)常用的方法必須掌握:-Create方法:創(chuàng)建使用指定路徑的新消息隊(duì)列。-Delete方法:刪除現(xiàn)有的消息隊(duì)列。-Existe方法:查看指定消息隊(duì)列是否存在。-GetAllMessages()方法:得到隊(duì)列中的所有消息。-GetPublicQueues方法:在“消息隊(duì)列”網(wǎng)絡(luò)中定位消息隊(duì)列。-Peek/BeginPeek方法:查看某

23、個(gè)特定隊(duì)列中的消息隊(duì)列,但不從該隊(duì)列中移出消息。-Receive/BeginReceive方法:檢索指定消息隊(duì)列中最前面的消息并將其從該隊(duì)列中移除。-Send方法:發(fā)送消息到指定的消息隊(duì)列。-Purge方法:清空指定隊(duì)列的消息。上述列舉的方法在此就不作詳細(xì)介紹,大家可以通過(guò)下面的示例程序中來(lái)體會(huì)他們各自的功能。       三、發(fā)送和序列化消息MSMQ消息隊(duì)列中定義的消息由一個(gè)主體(body)和若干屬性構(gòu)成。消息的主體可以由文本、二進(jìn)制構(gòu)成,根據(jù)需要還可以被加密。在MSMQ 中消息的大小不能夠超過(guò)4MB。發(fā)送消息是通過(guò)Send方法來(lái)完

24、成的,需要一個(gè)Message參數(shù)。1、發(fā)送消息:步驟:連接隊(duì)列->指定消息格式->提供要發(fā)送的數(shù)據(jù)(主體)->調(diào)用Send()方法將消息發(fā)送出去。詳細(xì)見后面的示例程序。2、序列化消息:消息序列化可以通過(guò).NET Framework附帶的三個(gè)預(yù)定義格式化程序來(lái)完成:- XMLMessageFormatter對(duì)象-MessageQueue組件的默認(rèn)格式化程序設(shè)置。- BinaryMessageFormatter對(duì)象;- ActiveXMessageFormatter對(duì)象;由于后兩者格式化后的消息通常不能為人閱讀,所以我們經(jīng)常用到的是XMLMessageFormatter對(duì)象。該對(duì)

25、象構(gòu)造方法有三種重載:       1public XmlMessageFormatter(); 2public XmlMessageFormatter(string targetTypeNames); 3public XmlMessageFormatter(Type targetTypes);如我們后面的示例程序中用到的序列化語(yǔ)句: 1/序列化為字符串 2XmlMessageFormatter formatter = new XmlM

26、essageFormatter(new Type  typeof(string) );     四、讀取和接收消息1、讀取消息:也就是從指定隊(duì)列中獲取消息,詳細(xì)請(qǐng)查看本文前面的關(guān)于消息操作的方法介紹。2、接收消息有兩種方式:-> 通過(guò)Receive方法-具體功能請(qǐng)返回本文前面有詳細(xì)介紹。-> 通過(guò)Peek方法-具體功能請(qǐng)返回本文前面有詳細(xì)介紹。五、消息使用實(shí)例通過(guò)上面一系列的介紹,了解了MessageQueue類和常用的方法后,下面我們通過(guò)一個(gè)簡(jiǎn)單的示例程序來(lái)分析消息隊(duì)列的創(chuàng)建、發(fā)送消息以及接收消息等相

27、關(guān)知識(shí)點(diǎn):1、通過(guò)Create方法創(chuàng)建使用指定路徑的新消息隊(duì)列 1/*/ <summary>  2/ 通過(guò)Create方法創(chuàng)建使用指定路徑的新消息隊(duì)列  3/ </summary>  4/ <param name="queuePath"></param>  5public static void Createqueue(string queuePath)  6  7&#

28、160;   try  8      9        if (!MessageQueue.Exists(queuePath) 10         11            MessageQueue.Create(&

29、quot;.private$myQueue"); 12         13        else 14         15            Console.WriteLine(queuePath + 

30、;"已經(jīng)存在!"); 16         17     18    catch (MessageQueueException e) 19     20        Console.WriteLine(e.Message); 21    

31、 222、連接消息隊(duì)列并發(fā)送消息到隊(duì)列 1/*/ <summary>  2/ 連接消息隊(duì)列并發(fā)送消息到隊(duì)列  3/ </summary>  4public static void SendMessage()  5  6    try  7      8        /連接到

32、本地的隊(duì)列  9        MessageQueue myQueue = new MessageQueue(".private$myQueue"); 10         11        Message myMessage = new Mes

33、sage(); 12        myMessage.Body = "消息內(nèi)容" 13        myMessage.Formatter = new XmlMessageFormatter(new Type  typeof(string) ); 14      &

34、#160; /發(fā)送消息到隊(duì)列中 15        myQueue.Send(myMessage); 16     17    catch (ArgumentException e) 18     19        Console.WriteLine(e.Message); 20

35、0;    213、連接消息隊(duì)列并從消息隊(duì)列中接收消息  1/*/ <summary>  2/ 連接消息隊(duì)列并從隊(duì)列中接收消息  3/ </summary>  4public static void ReceiveMessage()  5  6    /連接到本地隊(duì)列  7    MessageQueue myQu

36、eue = new MessageQueue(".private$myQueue");  8    myQueue.Formatter = new XmlMessageFormatter(new Type  typeof(string) );  9    try 10     11     

37、;   /從隊(duì)列中接收消息 12        Message myMessage = myQueue.Receive(); 13        string context = (string)myMessage.Body; /獲取消息的內(nèi)容 14       

38、60;Console.WriteLine("消息內(nèi)容為:" + context); 15     16    catch (MessageQueueException e) 17     18        Console.WriteLine(e.Message); 19     20 &

39、#160;  catch (InvalidCastException e) 21     22        Console.WriteLine(e.Message); 23     244、連接隊(duì)列并清空隊(duì)列的全部消息 1/*/ <summary> 2/ 清空指定隊(duì)列的消息 3/ </summary> 4public st

40、atic void ClearMessage() 5 6    MessageQueue myQueue = new MessageQueue(".private$myQueue"); 7    myQueue.Purge(); 8      5、連接隊(duì)列并獲取隊(duì)列的全部消息 1/*/ <summary>  2/ 連接隊(duì)列并獲取隊(duì)列的全

41、部消息  3/ </summary>  4public static void GetAllMessage()  5  6    /連接到本地隊(duì)列  7    MessageQueue myQueue = new MessageQueue(".private$myQueue");  8    Message

42、 message = myQueue.GetAllMessages();  9    XmlMessageFormatter formatter = new XmlMessageFormatter(new Type  typeof(string) ); 10    for (int i = 0; i < message.L

43、ength; i+) 11     12        messagei.Formatter = formatter; 13        Console.WriteLine(messagei.Body.ToString(); 14     15上面依次的列舉出來(lái)5個(gè)方法,這里我就不做測(cè)試了。上述方法全部通過(guò)測(cè)試的。 

44、    六、復(fù)雜消息發(fā)送實(shí)例通過(guò)上面一系列的介紹,對(duì)于簡(jiǎn)單消息的發(fā)送和接收及消息的管理應(yīng)該都不會(huì)有什么問題了,下面我在介紹一下關(guān)于復(fù)雜的消息處理,現(xiàn)在有這樣一個(gè)需 求,要求通過(guò)消息隊(duì)列將一本圖書信息發(fā)送到隊(duì)列里,然后從消息隊(duì)列里讀取出來(lái)。圖書的基本信息包括圖書編號(hào)、圖書名稱、圖書作者以及圖書定價(jià),這樣的一個(gè) 復(fù)雜的對(duì)象類型怎么來(lái)傳輸呢?詳細(xì)如下:  1namespace MSMQ.App  2  3    public class MsgQueue 

45、60;4      5        /*/ <summary>  6        / 通過(guò)Create方法創(chuàng)建使用指定路徑的新消息隊(duì)列  7        / </summary>  8   

46、     / <param name="queuePath"></param>  9        public static void Createqueue(string queuePath) 10         11    &#

47、160;       try 12             13                if (!MessageQueue.Exists(queuePath) 14     

48、0;           15                    MessageQueue.Create(".private$myQueue"); 16          &#

49、160;         MessageBox.Show("創(chuàng)建隊(duì)列成功!"); 17                 18                else 19

50、                 20                    MessageBox.Show(queuePath + "已經(jīng)存在!"); 21   

51、60;             22             23            catch (MessageQueueException e) 24     &

52、#160;       25                MessageBox.Show(e.Message); 26             27         28 29&

53、#160;       /*/ <summary> 30        / 連接消息隊(duì)列并發(fā)送消息到隊(duì)列 31        / </summary> 32        public static bool

54、0;SendMessage(Book book) 33         34            bool flag = false; 35            try 36     &

55、#160;       37                /連接到本地的隊(duì)列 38                MessageQueue myQueue = new Messa

56、geQueue(".private$myQueue"); 39 40                System.Messaging.Message myMessage = new System.Messaging.Message(); 41           

57、60;    myMessage.Body = book; 42                myMessage.Formatter = new XmlMessageFormatter(new Type  typeof(MSMQ.App.Book) ); 43    

58、            /發(fā)送消息到隊(duì)列中 44                myQueue.Send(myMessage); 45               

59、60;flag = true; 46             47            catch (ArgumentException e) 48             49 

60、0;              MessageBox.Show(e.Message); 50             51            return flag; 52   

61、;      53 54        /*/ <summary> 55        / 連接消息隊(duì)列并從隊(duì)列中接收消息 56        / </summary> 57       

62、; public static string ReceiveMessage() 58         59            /連接到本地隊(duì)列 60            MessageQueue myQueue =

63、 new MessageQueue(".private$myQueue"); 61            myQueue.Formatter = new XmlMessageFormatter(new Type  typeof(MSMQ.App.Book) ); 62        

64、60;   try 63             64                /從隊(duì)列中接收消息 65               

65、 System.Messaging.Message myMessage = myQueue.Receive(); 66                Book book = (Book)myMessage.Body; /獲取消息的內(nèi)容 67          

66、      return string.Format("編號(hào):0,書名:1,作者:2,定價(jià):3", 68                    book.BookId, 69           &#

67、160;        book.BookName, 70                    book.BookAuthor, 71               &#

68、160;    book.BookPrice); 72             73            catch (MessageQueueException e) 74          &#

69、160;  75                MessageBox.Show(e.Message); 76             77            catch (In

70、validCastException e) 78             79                MessageBox.Show(e.Message); 80           

71、0; 81            return null; 82         83     84其實(shí)發(fā)送復(fù)雜的消息也就是在消息序列化上有些差別,別的地方與發(fā)送普通文本消息沒什么大的變化,上面類里提供了創(chuàng)建隊(duì)列,發(fā)送消息到隊(duì)列,從隊(duì)列獲取消息三個(gè)方法,測(cè)試結(jié)果如下:上述中,完成了一個(gè)復(fù)雜類型的消息發(fā)送到隊(duì)列及從隊(duì)列中讀取的示例。 

72、60;下面啰嗦哈消息隊(duì)列的路徑配置的問題(即 上面的類中的path參數(shù)):偷了個(gè)懶,哈哈  舉個(gè)簡(jiǎn)單的例子來(lái)說(shuō)明哈吧:1 /本機(jī)消息隊(duì)列  2 /*公共隊(duì)列,消息隊(duì)列名為myQueue*/  3 ./myQueue  4 /*專用隊(duì)列,消息隊(duì)列名為myQueue*/  5 ./private$/myQueue  6 /*Format格式,計(jì)算機(jī)名為zhang,消息隊(duì)列名為myQueue*/  7 FormatName:DIRECT=OS:zhang/Pri

73、vate$/myQueue  8   9   10 /遠(yuǎn)程消息隊(duì)列  11 /*配置為Ip為30的服務(wù)器的專用消息隊(duì)列,隊(duì)列名為myQueue*/  12 FormatName:DIRECT=TCP:30/Private$/myQueue   OK,下面的小demo來(lái)測(cè)試哈我們的消息隊(duì)列是否可用:1 class Order  2     

74、0; 3         public string Id  get; set;   4         public DateTime Time  get; set;   5       6     class Program  7       8    

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論