返回首頁
當前位置: 主頁 > 互聯網技術 > 云計算 >

微軟消息隊列的基礎使用方式詳解

時間:2016-09-30 22:56來源:電腦教程學習網 www.aedwey.tw 編輯:admin

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

【正文】

一   使用前的準備工作

在使用消息隊列之前,需要在計算機中安裝消息隊列服務,安裝方法如下:
1.      打開“控制面板”;
2.      打開“程序和功能”;
3.      點擊“啟用或關閉Windows功能”;
4.      展開“Microsoft Message Queue(MSMQ)服務器”,選中“Microsoft Message Queue(MSMQ)服務器核心”,點擊“確定”按鈕即可。
在代碼中使用MSMQ,需要在項目中引用System.Messaging程序集,并在程序中引入System.Messaging命名空間。

二   消息隊列的創建

2.1       消息隊列的類型

消息隊列分為用戶自建隊列和系統隊列兩大類,常用的用戶自建隊列有以下幾種:
  公共隊列:在整個消息網絡復制,任何連接到隊列所在計算機的站點均可訪問;
  專用隊列:僅在隊列所在計算機上可用,只有知道隊列的完整路徑或者標簽才能夠訪問。

系統隊列有三種:
  日記隊列:存儲發送消息的副本和從隊列中移除的消息副本;
  死信隊列:存儲無法傳遞或已過期的消息的副本;
  事務性死信隊列:若無法傳遞或已過期的消息是事務性消息時,就存在事務性死信隊列中。
消息隊列還可以按照隊列中存儲的信息是否是事務性消息分為事務性隊列和非事務性隊列兩種。對于事務性隊列,在每次事務中發送的消息要么都發送成功要么都不成功。

2.2       消息隊列實例的構造

消息隊列的實例的默認構造函數為
MessageQueue queue=new MessageQueue();
queue.Path=” .\\Private$\\myQueue”;
在沒有加域的計算機上只能構造專用隊列,加入域的計算機上可以構造公共隊列和專用隊列。使用默認構造函數構造消息隊列后必須設置Path屬性才可以使用該隊列,也可以使用其他構造函數在構造消息隊列時就設置Path,例如
MessageQueue queue=new MessageQueue(“.\\Private$\\myQueue”);

Path參數的語法取決于要構造的消息隊列的類型,如下所示:
  公共隊列:MachineName\QueueName;
  專用隊列:MachineName\Private$\QueueName;
  日記隊列:MachineName\QueueName\Journal$;
  計算機日記隊列:MachineName\Journal$;
  計算機死信隊列:MachineName\Deadletter$;
  計算機事務性死信隊列:MachineName\XactDeadletter$;

也可以使用格式名稱或者標簽來描述消息隊列的路徑:
  格式名稱:FormatName: 格式名;
  標簽:Label:標簽。
格式名有如下幾種:
  FormatName:Public= 5A5F7535-AE9A-41d4-935C-845C2AFF7112
  FormatName:DIRECT=SPX: NetworkNumber; HostNumber\QueueName
  FormatName:DIRECT=TCP: IPAddress\QueueName
  FormatName:DIRECT=OS: MachineName\QueueName
只有使用格式名才可以創建遠程計算機上的消息隊列實例,使用“MachineName\Private$\QueueName”的格式無法工作。

在本地計算機上創建消息隊列的實例前,需要先判斷指定Path的消息隊列是否存在,若不存在,無法創建實例。判斷的代碼如下:
bool isExist= MessageQueue.Exist(“.\\Private$\\myQueue”);
若存在,返回值為true;若不存在,返回值為false。要注意的是,Exist方法不支持格式名稱類型的Path,這也就意味著無法判斷遠程計算機上的指定隊列是否存在。
當指定Path的消息隊列不存在時,需要使用以下代碼創建隊列:
MessageQueue queue=MessageQueue.Create(“.\\Private$\\myQueue”);
該方法默認創建非事務性消息隊列。如果要創建事務性消息隊列,需要使用如下代碼:
MessageQueue queue=MessageQueue.Create(“.\\Private$\\myQueue”,true);

關于消息列表的構造,總結如下:
  構造本地計算機上的消息隊列:
MessageQueue queue = null;
if (MessageQueue.Exists(“.\\Private$\\myQueue”))
queue = new MessageQueue(“.\\Private$\\myQueue”);
else
           queue = MessageQueue.Create(“.\\Private$\\myQueue”, false);
  構造遠程計算機上的消息隊列:
MessageQueue queue = new MessageQueue(“FormatName:DIRECT=TCP: 127.0.0.1\QueueName.\\Private$\\myQueue”);

三   消息的發送

消息隊列采用隊列的形式存儲所有的消息,因此先發送的消息比后發送的消息更靠近消息隊列的頭部。

3.1       非事務性消息的發送

發送非事務性消息的代碼如下:
myQueue.Send(“消息數據”);
 

3.2       事務性消息的發送

發送事務性消息的代碼如下:
MessageQueueTransaction myTransaction = new MessageQueueTransaction();
myTransaction.Begin();
myQueue.Send("消息數據", myTransaction);
myTransaction.Commit();
Send方法的參數類型為object,意味著可以發送任何類型的消息。

四   消息的接收

4.1       接收隊列里的所有消息

如果要一次性接收隊列里的所有消息,需要使用如下代碼:
MessageQueue queue= new MessageQueue(“.\\Private$\\myQueue”);
Message[] messages=queue.GetAllMessages();
foreach(Message msg in messages)
        {
            //做操作
        }
也可以使用:
MessageQueue queue= new MessageQueue(“.\\Private$\\myQueue”);
MessageEnumerator enumerator = queue.GetMessageEnumerator2();
while(enumerator.MoveNext())
{
       Message message= enumerator.Current;
       //做操作
}
 

4.2       接收當前隊列中的第一條消息

4.2.1      判斷消息隊列中是否有消息

在接收消息前,有以下兩種方式判斷隊列中是否存在消息可以接收:
  獲取所有消息,判斷消息隊列的長度是否大于0
MessageQueue queue= new MessageQueue(“.\\Private$\\myQueue”);
if(queue. GetAllMessages().Length>0){//接收消息}
  獲取消息游標,判斷游標能否移動到第一條消息處:
MessageQueue queue= new MessageQueue(“.\\Private$\\myQueue”);
MessageEnumerator enumerator = queue.GetMessageEnumerator2();
if(enumerator.MoveNext()){//接收消息}

4.2.2      接收第一條消息并移出隊列

如果要接受第一條消息并且將該條消息從隊列中刪除,需要使用Receive()方法:
MessageQueue queue= new MessageQueue(“.\\Private$\\myQueue”);
Message message=queue.Receive();

4.2.3      接收第一條消息不移出隊列

如果要將消息保留在隊列中,則應該用Peek()方法:
MessageQueue queue= new MessageQueue(“.\\Private$\\myQueue”);
Message message=queue.Peek();
 
無論是獲取所有消息還是獲取單條消息,獲取到的都是Message的實例,而不是之前發送消息是傳送的實例。要想將Message實例轉換為所傳送的實例,只需要對Message實例的Body屬性做強制轉換即可:
T t = (T)message.Body;
//做操作
 
以上就是微軟消息隊列的基本使用方式。
------分隔線----------------------------
標簽(Tag):微軟消息隊列
------分隔線----------------------------
推薦內容
猜你感興趣
26选5中奖通告