WCF分布式開發(fā)之MSMQ消息隊列
一、MSMQ簡介
MSMQ(微軟消息隊列)是Windows操作系統(tǒng)中消息應用程序的基礎,是用于創(chuàng)建分布式、松散連接的消息通訊應用程序的開發(fā)工具。
MSMQ與XML Web Services和.Net Remoting一樣,是一種分布式開發(fā)技術(shù)。但是在使用XML Web Services或.Net Remoting組件時,Client端需要和Server端實時交換信息,Server需要保持聯(lián)機。MSMQ則可以在Server離線的情況下工作,將Message臨時保存在Client端的消息隊列中,以后聯(lián)機時再發(fā)送到Server端處理。
1、MSMQ的實現(xiàn)原理
消息的發(fā)送者把自己想要發(fā)送的信息放入一個容器,然后把它保存到一個系統(tǒng)公用空間的消息隊列中,本地或異地的消息接收程序再從該隊列中取出發(fā)給它的消息進行處理。
消息隊列是一個公用存儲空間,它可以存在于內(nèi)存中或物理文件中,因此,消息以兩種方式發(fā)送,即快遞方式和可恢復模式。MSMQ機制類似QQ消息傳遞機制。下圖演示了MSMQ的實現(xiàn)原理。
2、安裝
默認情況下安裝操作系統(tǒng)是不安裝消息隊列的,你可以在控制面板中找到添加/刪除程序,然后選擇添加/刪除Windows組件一項,然后選擇應用程序服務器,雙擊它進入詳細資料中選擇消息隊列一項進行安裝。
如果服務沒有自動啟動,需要啟動服務:
3、兩個概念
一個是消息Message:Message是通信雙方需要傳遞的消息,它可以是文本、圖片、視頻等。消息包含發(fā)送和接收者的標識,只有指定的用戶才能取得消息。
另一個是隊列Queue:用來保存消息的存儲空間,消息對列分為3類:
- 公共隊列:MachineName\QueueName
能被別的機器所訪問,如果你的多個項目中用到消息隊列,那么你可以把隊列定義為公共隊列 - 專用隊列:MachineName\Private$\QueueName
只針對于本機的程序才可以調(diào)用的隊列,有些情況下為了安全起見定義為私有隊列。 - 日志隊列:MachineName\QueueName\Journal$
4、MicroSoft.Message.Queue常用的方法:
- Create方法:創(chuàng)建使用指定路徑的新消息隊列。
- Delete方法:刪除現(xiàn)有的消息隊列。
- Existe方法:查看指定消息隊列是否存在。
- GetPublicQueues方法:在“消息隊列”網(wǎng)絡中定位消息隊列。
- Send方法:發(fā)送消息到指定的消息隊列。
- GetAllMessages()方法:得到隊列中的所有消息。
- Receive/BeginReceive方法:檢索指定消息隊列中最前面的消息,并將其從該隊列中移除
- Peek/BeginPeek方法:查看某個特定隊列中的消息隊列,但不從該隊列中移出消息。。
- Purge方法:清空指定隊列的消息。
二、服務端
首先,實現(xiàn)服務器端。創(chuàng)建一個控制臺項目,添加System.Messaging引用,因為消息隊列的類全部封裝在System.Messaging.dll程序集里。
服務器端代碼需要注意的是,公共隊列只能在域環(huán)境中創(chuàng)建,如果個人電腦沒有加入域環(huán)境,則不能創(chuàng)建公共隊列。
if (!MessageQueue.Exists(@".\MYFIRSTMSMQ")) { using (MessageQueue mq = MessageQueue.Create(@".\MYFIRSTMSMQ"))//創(chuàng)建一個公共消息隊列 { mq.Label = "myFirstMSMQ"; Console.WriteLine("已經(jīng)創(chuàng)建了一個公共隊列{0}", mq.Label); Console.WriteLine("公共隊列{0}的路徑為{1}", mq.Label, mq.Path); mq.Send("MSMQ 消息", "今天又學到個有趣的知識"); } } foreach (MessageQueue mq in MessageQueue.GetPublicQueues())//獲取所有公共隊列,發(fā)送消息 { mq.Send("發(fā)送公共消息隊列" + DateTime.Now.ToLongTimeString(), "今天又學到個有趣的知識"); Console.WriteLine("公有消息已經(jīng)送到{0}", mq.Path); } if (!MessageQueue.Exists(@".\Private$\MYFIRSTMSMQ")) { using (MessageQueue mq = MessageQueue.Create(@".\Private$\MYFIRSTMSMQ"))//創(chuàng)建一個私有消息隊列 { mq.Label = "myFirstPrivateMSMQ"; Console.WriteLine("已經(jīng)創(chuàng)建了一個私有隊列{0}", mq.Label); Console.WriteLine("私有隊列{0}的路徑為{1}", mq.Label, mq.Path); mq.Send("MSMQ 私有隊列消息" + "今天又學到個有趣的知識"); } } if (MessageQueue.Exists(@".\Private$\MYFIRSTMSMQ")) { MessageQueue mq = new MessageQueue(@".\Private$\MYFIRSTMSMQ");//找到私有隊列,發(fā)送消息 mq.Send("發(fā)送私有消息隊列" + DateTime.Now.ToLongTimeString() + "今天又學到個有趣的知識"); Console.WriteLine("私有消息已經(jīng)送到{0}", mq.Path); }
三、客戶端
服務器端把消息發(fā)送到共享的消息隊列中,然后,客戶端從這個共享的消息隊列中取出消息進行處理。
if (MessageQueue.Exists(@".\MYFIRSTMSMQ"))// 獲取公共消息隊列 { using (MessageQueue mq = new MessageQueue(@".\MYFIRSTMSMQ"))//創(chuàng)建消息隊列對象 { mq.Formatter = new XmlMessageFormatter(new string[] { "System.String" });//設置消息隊列的格式化器,還有BinaryMessageFormatter,ActiveXMessageFormatter等 foreach (Message msg in mq.GetAllMessages()) { Console.WriteLine("接收到的消息是:{0}", msg.Body); } Message firstmsg = mq.Receive(); Console.WriteLine("收到的第一條消息為:{0}", firstmsg.Body); } } if (MessageQueue.Exists(@".\Private$\MYFIRSTMSMQ"))// 獲取私有消息隊列 { using (MessageQueue mq = new MessageQueue(@".\Private$\MYFIRSTMSMQ")) { //.... } }
到此這篇關(guān)于WCF分布式開發(fā)之MSMQ消息隊列的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
c# 用Dictionary實現(xiàn)日志數(shù)據(jù)批量插入
這篇文章主要介紹了c# 用Dictionary實現(xiàn)日志數(shù)據(jù)批量插入的步驟,幫助大家更好的理解和使用c#中的Dictionary類,感興趣的朋友可以了解下2021-02-02C#托管內(nèi)存與非托管內(nèi)存之間的轉(zhuǎn)換的實例講解
在本篇文章里小編給大家整理了關(guān)于C#托管內(nèi)存與非托管內(nèi)存之間的轉(zhuǎn)換的實例以及相關(guān)知識點,需要的朋友們學習下。2019-08-08C#/VB.NET實現(xiàn)PPT或PPTX轉(zhuǎn)換為圖像功能
由于大多數(shù)便攜式設備支持瀏覽圖片而不支持瀏覽PowerPoint 文件,所以相比較而言,圖像對于用戶而言更加友好。本文將利用C#/VB.NET實現(xiàn)PPT或PPTX轉(zhuǎn)換為圖像功能,需要的可以參考一下2022-08-08