日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

NET中MSMQ的使用----附例子

發(fā)布時(shí)間:2024/9/20 56 豆豆
生活随笔 收集整理的這篇文章主要介紹了 NET中MSMQ的使用----附例子 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

目錄

  • 一:MSMQ的一些理論上的知識(shí)
  • 二:隊(duì)列類型(Queue Type)
  • 三:安裝消息隊(duì)列
  • 四:在C#中Messagequeue class
  • 五:MSMQ-發(fā)送消息到遠(yuǎn)程專用隊(duì)列
  • 六:例子
  • 一、在學(xué)習(xí)Messagequeue 類之前,首先介紹一下MSMQ的一些理論上的知識(shí)????????? MSMQ(MicroSoft Message Queue,微軟消息隊(duì)列)官方的解釋是:在多個(gè)不同的應(yīng)用之間實(shí)現(xiàn)相互通信的一種異步傳輸模式,相互通信的應(yīng)用可以分布于同一臺(tái)機(jī)器上,也可以分布于相連的網(wǎng)絡(luò)空間中的任一位置。MSMQ通過(guò)發(fā)送和接受消息使得應(yīng)用程序之間的通信變的更快和更可靠。
    ???? 它的實(shí)現(xiàn)原理是:消息的發(fā)送者把自己想要發(fā)送的信息放入一個(gè)容器中(我們稱之為Message),然后把它保存至一個(gè)系統(tǒng)公用空間的消息隊(duì)列(Message Queue)中;本地或者是異地的消息接收程序再?gòu)脑撽?duì)列中取出發(fā)給它的消息進(jìn)行處理。
    ????????? 在消息傳遞機(jī)制中,有兩個(gè)比較重要的概念。一個(gè)是消息,一個(gè)是隊(duì)列。消息是由通信的雙方所需要傳遞的信息,說(shuō)白了它可以是各式各樣的媒體,如文本、聲音、圖象,在我們編程的時(shí)候,它一般是一個(gè)類的對(duì)象或字符串等,消息最終的理解方式,為消息傳遞的雙方事先商定,這樣做的好處是,一是相當(dāng)于對(duì)數(shù)據(jù)進(jìn)行了簡(jiǎn)單的加密,二則采用自己定義的格式可以節(jié)省通信的傳遞量。隊(duì)列是發(fā)送和接收消息的公用存儲(chǔ)空間,它可以存在于內(nèi)存中或者是物理文件中。
    ????????? 采用MSMQ帶來(lái)的好處是:由于是異步通信,無(wú)論是發(fā)送方還是接收方都不用等待對(duì)方返回成功消息,就可以執(zhí)行余下的代碼,因而大大地提高了事物處理的能力;當(dāng)信息傳送過(guò)程中,信息發(fā)送機(jī)制具有一定功能的故障恢復(fù)能力;MSMQ的消息傳遞機(jī)制使得消息通信的雙方具有不同的物理平臺(tái)成為可能。在微軟的.net平臺(tái)上利用其提供的MSMQ功能,可以輕松創(chuàng)建或者刪除消息隊(duì)列、發(fā)送或者接收消息、甚至于對(duì)消息隊(duì)列進(jìn)行管理。

    二:隊(duì)列類型(Queue Type)????????? 由您或網(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)訪問(wèn)。?
    ????????? “專用隊(duì)列”不在整個(gè)網(wǎng)絡(luò)中發(fā)布。相反,它們僅在所駐留的本地計(jì)算機(jī)上可用。專用隊(duì)列只能由知道隊(duì)列的完整路徑名或標(biāo)簽的應(yīng)用程序訪問(wèn)。?
    ????????? “管理隊(duì)列”包含確認(rèn)在給定“消息隊(duì)列”網(wǎng)絡(luò)中發(fā)送的消息回執(zhí)的消息。指定希望 MessageQueue 組件使用的管理隊(duì)列(如果有的話)。???????
    ????????? “響應(yīng)隊(duì)列”包含目標(biāo)應(yīng)用程序接收到消息時(shí)返回給發(fā)送應(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á)目標(biāo)所經(jīng)過(guò)的路由的消息,還可以包含測(cè)試消息。每臺(tái)計(jì)算機(jī)上只能有一個(gè)報(bào)告隊(duì)列。 “專用系統(tǒng)隊(duì)列”是一系列存儲(chǔ)系統(tǒng)執(zhí)行消息處理操作所需的管理和通知消息的專用隊(duì)列。 在應(yīng)用程序中進(jìn)行的大多數(shù)工作都涉及訪問(wèn)公共隊(duì)列及其消息。但是,根據(jù)應(yīng)用程序的日記記錄、確認(rèn)和其他特殊處理需要,在日常操作中很可能要使用幾種不同的系統(tǒng)隊(duì)列。

    三:安裝消息隊(duì)列

    如果你相使用消息隊(duì)列進(jìn)行通信的話,你就必須在你的電腦上安裝消息隊(duì)列,通過(guò)組件安裝,具體安裝的方法在這里就不詳解了,類似于安裝IIS一樣

     

      對(duì)消息隊(duì)列有了簡(jiǎn)單的了解后,使用MSMQ進(jìn)行軟件開發(fā)需要安裝MSMQ,安裝完后就該進(jìn)入實(shí)際的開發(fā)階段。具體的安裝過(guò)程就是在控制面板里“添加/刪除程序”下“添加/刪除Windows組件”,完成添加就OK。安裝完成后就可以通過(guò)交互界添加新的消息隊(duì)列,詳細(xì)如下圖:

      

    出了上面這種交互界面來(lái)創(chuàng)建MSMQ外,也可以通過(guò)編程來(lái)完成。

    四:在C#中Messagequeue class

    在使用.net開發(fā)msmq時(shí),你必須引入命名空System.Messaging

    MessageQueue 支持兩種消息類型,同步和異步,同步方法使用的是peek();receive();異步使用的是:

    Beginpeek() and Beginreceive();兩者沒(méi)有什么本質(zhì)區(qū)別,都是封裝好的方法,你只要直接創(chuàng)建Messagequeue的對(duì)象來(lái)調(diào)用這個(gè)方法就OK了, 我想至于什么同步和異步是什么意思,就沒(méi)有必有解釋了吧,

    五:MSMQ-發(fā)送消息到遠(yuǎn)程專用隊(duì)列

    在工作組模式下,遠(yuǎn)程訪問(wèn)專用隊(duì)列。在網(wǎng)上找到一篇文章,翻譯了一下。 最后結(jié)論,直接使用多元素格式名方式,利用IP地址直接對(duì)單個(gè)或多個(gè)目標(biāo)發(fā)送消息 MessageQueue rmQ = new MessageQueue("FormatName:Direct=TCP:121.0.0.1//private$//queue,Direct=TCP:192.168.1.2//private$//queue"); rmQ.Send("sent to regular queue - Atul"); 原文地址 http://www.infosysblogs.com/microsoft/2007/02/msmq_sending_message_to_remote.html 1.當(dāng)需要引用遠(yuǎn)程隊(duì)列時(shí),使用“machinename/private$/queuename”的格式無(wú)法工作。會(huì)返回“invalid queue path”錯(cuò)誤。 2.隊(duì)列名稱需要使用“"FormatName:Direct=OS:machinename//private$//queuename”的格式。其他友好形式的表達(dá)式都是被轉(zhuǎn)換為FormatName格式之后進(jìn)行調(diào)用的。而且其他這些友好表達(dá)式的轉(zhuǎn)換是基于Active Directory(域)來(lái)進(jìn)行解析的,如果沒(méi)有域的支持,這些表達(dá)式將無(wú)法工作。 例: MessageQueue rmQ = new MessageQueue? ("FormatName:Direct=OS:machinename//private$//queue"); rmQ.Send("sent to regular queue - Atul"); 3.FontName是區(qū)分大小寫的。如果表達(dá)式為“FORMATNAME:Direct=OS:machinename//private$//queuename”,是無(wú)法工作的。但這種表達(dá)式不會(huì)返回任何錯(cuò)誤。FontName好像是表達(dá)式里唯一區(qū)分大小寫的部分。其他部分可以隨意使用大小寫,例如可以使用“DIRECT”。 4.如果想要使用機(jī)器IP地址,表達(dá)式的語(yǔ)法為“FormatName:Direct=TCP:ipaddress//private$//queuename” 例: MessageQueue rmQ = new MessageQueue ("FormatName:Direct=TCP:121.0.0.1//private$//queue"); rmQ.Send("sent to regular queue - Atul"); 5.在代碼中創(chuàng)建的隊(duì)列實(shí)例對(duì)象的事務(wù)性屬性,必須與要發(fā)送的目標(biāo)隊(duì)列的屬性相匹配。前面的例子中發(fā)送的消息為非事務(wù)型消息,如果要發(fā)送消息到事務(wù)型的隊(duì)列,代碼為: MessageQueue rmTxnQ = new MessageQueue ("FormatName:Direct=OS:machinename//private$//queue"); rmTxnQ.Send("sent to Txn queue - Atul", MessageQueueTransactionType.Single); 如果事務(wù)型屬性不匹配,消息將無(wú)法傳遞。系統(tǒng)不會(huì)返回任何錯(cuò)誤,但該條消息卻會(huì)丟掉。 6.最后,當(dāng)你發(fā)送消息到遠(yuǎn)程隊(duì)列,系統(tǒng)會(huì)在本機(jī)創(chuàng)建一個(gè)臨時(shí)的傳出隊(duì)列。這樣做的目的是防止遠(yuǎn)程隊(duì)列無(wú)法訪問(wèn)。在計(jì)算機(jī)管理器中查看消息隊(duì)列/傳出隊(duì)列,可以看到這些臨時(shí)隊(duì)列。在管理器的右側(cè)可以顯示狀態(tài)(聯(lián)通、未聯(lián)通)以及IP地址。

    六:例子

    ------------------------------------------------------------------------------

    using System;

    using System.Collections.Generic;

    using System.Text;

    using System.Messaging;

    namespace MyQueue

    {

    ?? ?public class MyMessageQueue

    ?? ?{

    ?? ? ? ?private string Path;

    ?? ? ? ?/// <summary>

    ?? ? ? ?/// 1.通過(guò)Create方法創(chuàng)建使用指定路徑的新消息隊(duì)列

    ?? ? ? ?/// </summary>

    ?? ? ? ?/// <param name="queuePath"></param>

    ?? ? ? ?public void Createqueue(string queuePath)

    ?? ? ? ?{

    ?? ? ? ? ? ?try

    ?? ? ? ? ? ?{

    ?? ? ? ? ? ? ? ?if (!MessageQueue.Exists(queuePath))

    ?? ? ? ? ? ? ? ?{

    ?? ? ? ? ? ? ? ? ? ?MessageQueue.Create(queuePath);

    ?? ? ? ? ? ? ? ?}

    ?? ? ? ? ? ? ? ?else

    ?? ? ? ? ? ? ? ?{

    ?? ? ? ? ? ? ? ? ? ?Console.WriteLine(queuePath + "已經(jīng)存在!");

    ?? ? ? ? ? ? ? ? ? ?//MessageQueue.Delete(queuePath);

    ?? ? ? ? ? ? ? ? ? ?//MessageQueue.Create(queuePath);

    ?? ? ? ? ? ? ? ? ? ?//Console.WriteLine(queuePath + "刪除重建");

    ?? ? ? ? ? ? ? ?}

    ?? ? ? ? ? ? ? ?Path = queuePath;

    ?? ? ? ? ? ?}

    ?? ? ? ? ? ?catch (MessageQueueException e)

    ?? ? ? ? ? ?{

    ?? ? ? ? ? ? ? ?Console.WriteLine(e.Message);

    ?? ? ? ? ? ?}

    ?? ? ? ?}

    ?? ? ? ?/// <summary>

    ?? ? ? ?/// ?2.連接消息隊(duì)列并發(fā)送消息到隊(duì)列

    ?? ? ? ?/// 遠(yuǎn)程模式:MessageQueue rmQ = new MessageQueue("FormatName:Direct=OS:machinename//private$//queue");

    ?? ? ? ?/// ? ? rmQ.Send("sent to regular queue - Atul");對(duì)于外網(wǎng)的MSMQ只能發(fā)不能收

    ?? ? ? ?/// </summary>

    ?? ? ? ?public void SendMessage()

    ?? ? ? ?{

    ?? ? ? ? ? ?try

    ?? ? ? ? ? ?{

    ?? ? ? ? ? ? ? ?//連接到本地隊(duì)列

    ?? ? ? ? ? ? ? ?MessageQueue myQueue = new MessageQueue(Path);

    ?? ? ? ? ? ? ? ?//MessageQueue myQueue = new MessageQueue("FormatName:Direct=TCP:192.168.12.79//Private$//myQueue1");

    ?? ? ? ? ? ? ? ?//MessageQueue rmQ = new MessageQueue("FormatName:Direct=TCP:121.0.0.1//private$//queue");--遠(yuǎn)程格式

    ?? ? ? ? ? ? ? ?Message myMessage = new Message();

    ?? ? ? ? ? ? ? ?myMessage.Body = "消息內(nèi)容34kuangbo去死";

    ?? ? ? ? ? ? ? ?myMessage.Formatter = new XmlMessageFormatter(new Type[] { typeof(string) });

    ?? ? ? ? ? ? ? ?//發(fā)生消息到隊(duì)列中

    ?? ? ? ? ? ? ? ?myQueue.Send(myMessage);

    ?? ? ? ? ? ? ? ?Console.WriteLine("消息發(fā)送成功!");

    ?? ? ? ? ? ? ? ?Console.ReadLine();

    ?? ? ? ? ? ?}

    ?? ? ? ? ? ?catch (ArgumentException e)

    ?? ? ? ? ? ?{

    ?? ? ? ? ? ? ? ?Console.WriteLine(e.Message);

    ?? ? ? ? ? ?}

    ?? ? ? ?}

    ?? ? ? ?/// <summary>

    ?? ? ? ?/// 3.連接消息隊(duì)列并從隊(duì)列中接收消息

    ?? ? ? ?/// </summary>

    ?? ? ? ?public void ReceiveMessage()

    ?? ? ? ?{

    ?? ? ? ? ? ?MessageQueue myQueue = new MessageQueue(Path);

    ?? ? ? ? ? ?myQueue.Formatter = new XmlMessageFormatter(new Type[] { typeof(string) });

    ?? ? ? ? ? ?try

    ?? ? ? ? ? ?{

    ?? ? ? ? ? ? ? ?//從隊(duì)列中接收消息

    ?? ? ? ? ? ? ? ?Message myMessage = myQueue.Receive();// myQueue.Peek();--接收后不消息從隊(duì)列中移除

    ?? ? ? ? ? ? ? ?string context = myMessage.Body.ToString();

    ?? ? ? ? ? ? ? ?Console.WriteLine("消息內(nèi)容:" + context);

    ?? ? ? ? ? ? ? ?Console.ReadLine();

    ?? ? ? ? ? ?}

    ?? ? ? ? ? ?catch (MessageQueueException e)

    ?? ? ? ? ? ?{

    ?? ? ? ? ? ? ? ?Console.WriteLine(e.Message);

    ?? ? ? ? ? ?}

    ?? ? ? ? ? ?catch (InvalidCastException e)

    ?? ? ? ? ? ?{

    ?? ? ? ? ? ? ? ?Console.WriteLine(e.Message);

    ?? ? ? ? ? ?}

    ?? ? ? ?}

    ?? ? ? ?/// <summary>

    ?? ? ? ?/// 4.清空指定隊(duì)列的消息

    ?? ? ? ?/// </summary>

    ?? ? ? ?public void ClealMessage()

    ?? ? ? ?{

    ?? ? ? ? ? ?MessageQueue myQueue = new MessageQueue(Path);

    ?? ? ? ? ? ?myQueue.Purge();

    ?? ? ? ? ? ?Console.WriteLine("已清空對(duì)了{(lán)0}上的所有消息",Path);

    ?? ? ? ?}

    ?? ? ? ?/// <summary>

    ?? ? ? ?/// 5.連接隊(duì)列并獲取隊(duì)列的全部消息

    ?? ? ? ?/// </summary>

    ?? ? ? ?public void GetAllMessage()

    ?? ? ? ?{

    ?? ? ? ? ? ?MessageQueue myQueue = new MessageQueue(Path);

    ?? ? ? ? ? ?Message[] allMessage = myQueue.GetAllMessages();

    ?? ? ? ? ? ?XmlMessageFormatter formatter = new XmlMessageFormatter(new Type[] { typeof(string) });

    ?? ? ? ? ? ?for (int i = 0; i < allMessage.Length; i++)

    ?? ? ? ? ? ?{

    ?? ? ? ? ? ? ? ?allMessage[i].Formatter = formatter;

    ?? ? ? ? ? ? ? ?Console.WriteLine("第{0}機(jī)密消息為:{1}", i+1, allMessage[i].Body.ToString());

    ?? ? ? ? ? ?}

    ?? ? ? ? ? ?Console.ReadLine();

    ?? ? ? ?}

    ?? ?}

    }

    ------------------------ using System; using System.Collections.Generic; using System.Text; namespace MyQueue { class Program { static void Main(string[] args) { MyMessageQueue queue = new MyMessageQueue(); queue.Createqueue(".//Private$//myQueue2"); queue.SendMessage(); queue.GetAllMessage(); //queue.ReceiveMessage(); //queue.ClealMessage(); } } }

    注意:傳輸?shù)?路徑格式 要正確。

    出處:http://blog.csdn.net/sage425/article/details/6298461

    總結(jié)

    以上是生活随笔為你收集整理的NET中MSMQ的使用----附例子的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。