• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            網(wǎng)絡(luò)服務(wù)器軟件開發(fā)/中間件開發(fā),關(guān)注ACE/ICE/boost

            C++博客 首頁 新隨筆 聯(lián)系 聚合 管理
              152 Posts :: 3 Stories :: 172 Comments :: 0 Trackbacks
            MSMQ(MicroSoft Message Queue,微軟消息隊(duì)列)是在多個(gè)不同的應(yīng)用之間實(shí)現(xiàn)相互通信的一種異步傳輸模式,相互通信的應(yīng)用可以分布于同一臺(tái)機(jī)器上,也可以分布于相連的網(wǎng)絡(luò)空間中的任一位置。它的實(shí)現(xiàn)原理是:消息的發(fā)送者把自己想要發(fā)送的信息放入一個(gè)容器中(我們稱之為Message),然后把它保存至一個(gè)系統(tǒng)公用空間的消息隊(duì)列(Message Queue)中;本地或者是異地的消息接收程序再從該隊(duì)列中取出發(fā)給它的消息進(jìn)行處理。

            在消息傳遞機(jī)制中,有兩個(gè)比較重要的概念。一個(gè)是消息,一個(gè)是隊(duì)列。消息是由通信的雙方所需要傳遞的信息,它可以是各式各樣的媒體,如文本、聲音、圖象等等。消息最終的理解方式,為消息傳遞的雙方事先商定,這樣做的好處是,一是相當(dāng)于對數(shù)據(jù)進(jìn)行了簡單的加密,二則采用自己定義的格式可以節(jié)省通信的傳遞量。消息可以含有發(fā)送和接收者的標(biāo)識(shí),這樣只有指定的用戶才能看到只傳遞給他的信息和返回是否操作成功的回執(zhí)。消息也可以含有時(shí)間戳,以便于接收方對某些與時(shí)間相關(guān)的應(yīng)用進(jìn)行處理。消息還可以含有到期時(shí)間,它表明如果在指定時(shí)間內(nèi)消息還未到達(dá)則作廢,這主要應(yīng)用與時(shí)間性關(guān)聯(lián)較為緊密的應(yīng)用。

            消息隊(duì)列是發(fā)送和接收消息的公用存儲(chǔ)空間,它可以存在于內(nèi)存中或者是物理文件中。消息可以以兩種方式發(fā)送,即快遞方式(express)和可恢復(fù)模式(recoverable),它們的區(qū)別在于,快遞方式為了消息的快速傳遞,把消息放置于內(nèi)存中,而不放于物理磁盤上,以獲取較高的處理能力;可恢復(fù)模式在傳送過程的每一步驟中,都把消息寫入物理磁盤中,以得到較好的故障恢復(fù)能力。消息隊(duì)列可以放置在發(fā)送方、接收方所在的機(jī)器上,也可以單獨(dú)放置在另外一臺(tái)機(jī)器上。正是由于消息隊(duì)列在放置方式上的靈活性,形成了消息傳送機(jī)制的可靠性。當(dāng)保存消息隊(duì)列的機(jī)器發(fā)生故障而重新啟動(dòng)以后,以可恢復(fù)模式發(fā)送的消息可以恢復(fù)到故障發(fā)生之前的狀態(tài),而以快遞方式發(fā)送的消息則丟失了。另一方面,采用消息傳遞機(jī)制,發(fā)送方必要再擔(dān)心接收方是否啟動(dòng)、是否發(fā)生故障等等非必要因素,只要消息成功發(fā)送出去,就可以認(rèn)為處理完成,而實(shí)際上對方可能甚至未曾開機(jī),或者實(shí)際完成交易時(shí)可能已經(jīng)是第二天了。

            采用MSMQ帶來的好處是:由于是異步通信,無論是發(fā)送方還是接收方都不用等待對方返回成功消息,就可以執(zhí)行余下的代碼,因而大大地提高了事物處理的能力;當(dāng)信息傳送過程中,信息發(fā)送機(jī)制具有一定功能的故障恢復(fù)能力;MSMQ的消息傳遞機(jī)制使得消息通信的雙方具有不同的物理平臺(tái)成為可能。

            在微軟的.net平臺(tái)上利用其提供的MSMQ功能,可以輕松創(chuàng)建或者刪除消息隊(duì)列、發(fā)送或者接收消息、甚至于對消息隊(duì)列進(jìn)行管理。

              在.NET產(chǎn)品中,提供了一個(gè)MSMQ類庫"System.Messaging.dll"。它提供了兩個(gè)類分別對消息對象和消息隊(duì)列對象進(jìn)行操作。在能夠使用MSMQ功能之前,你必須確定你的機(jī)器上安裝了MSMQ消息隊(duì)列組件,并確保服務(wù)正在運(yùn)行中。在使用ASP.NET編程時(shí),應(yīng)在頭部使用:

               <%@ Assembly Name="System.Messaging"%>

               <%@ Import NameSpace="System.Messsaging"%>

              將MSMQ類庫引入ASP.NET文件

              1. 對消息隊(duì)列的創(chuàng)建

               dim MsgQue as MessageQueue

               MsgQue=New MessageQueue(MsgPath)

            其中:MsgPath可以為本地私有隊(duì)列,如".\MyQueue",也可以為其他機(jī)器的公有隊(duì)列,如"Saidy\777$\MyQueue",Saidy為另一機(jī)器名。


              2. 消息的發(fā)送

               dim MsgQue as MessageQueue

               MsgQue.Send(Msg)

               其中:Msg為任一對象。

              3. 消息的接收

              消息的接收又分成同步和異步方式兩種,同步接收在規(guī)定時(shí)間內(nèi)從消息隊(duì)列中取出收到的第一條消息,當(dāng)消息隊(duì)列中沒有消息時(shí),程序處于等待狀態(tài);異步接收方式則是定義了一個(gè)事件處理函數(shù),當(dāng)消息隊(duì)列中第一個(gè)消息到達(dá)時(shí)立即觸發(fā)該函數(shù)。

              1) 同步方式

               dim Msg as Message

              dim Fmt As XmlMessageFormatter

              Fmt= CType(MsgQue.Formatter,XmlMessageFormatter)

              Fmt.TargetTypeNames = new String(){"System.String"}

              Msg=MsgQue.receive(New TimeSpan(0,0,3))

              首先定義收到消息應(yīng)轉(zhuǎn)換成的格式,然后在指定時(shí)間內(nèi)去接收消息

              2) 異步方式



            dim Fmt As XmlMessageFormatter
            ''定義接收消息類型
            Fmt = CType(MsgQue.Formatter,XmlMessageFormatter)
            Fmt.TargetTypeNames = new String(){"System.String"}

            ''定義消息處理函數(shù)入口
            AddHandler MsgQue.ReceiveCompleted, New ReceiveCompletedEventHandler
            (AddressOf OnReceiveCompleted)

            ''定義消息處理函數(shù)
            Public Shared Sub OnReceiveCompleted(s As Object, asyncResult As ReceiveAsyncEventArgs)
            Dim MsgQue As MessageQueue = CType(s,MessageQueue)
            Dim Msg As Message = MsgQue.EndReceive(asyncResult.AsyncResult)
            ''此時(shí)Msg.Body即為所取消息對象
            MsgQue.BeginReceive()
            ''重新定義異步接收方式
            End sub

            ''啟動(dòng)異步接收方式
            MsgQue.BeginReceive


              消息隊(duì)列配置屬性

              關(guān)于隊(duì)列的屬性

               path屬性:它可以決定引用隊(duì)列的三種方式,路徑引用、格式名引用、標(biāo)識(shí)引用

               category屬性:標(biāo)識(shí)當(dāng)前使用的隊(duì)列的類型。Category是隊(duì)列所有者定義的GUID值。該GUID值可以有GUID生成工具產(chǎn)生或者是用戶自定義的數(shù)字值。GUID值不會(huì)唯一,這樣才可以根據(jù)相同的GUID值,把多個(gè)消息隊(duì)列劃分為不同的類別(category)。

              跟發(fā)送數(shù)據(jù)類型相關(guān)的屬性

              Formatter屬性:決定在一個(gè)隊(duì)列中如何發(fā)送和接收消息的順序,以及可以在一個(gè)消息中發(fā)送什么樣的內(nèi)容。

             和隊(duì)列交互相關(guān)的屬性
            DenyShareReceive屬性:決定同一時(shí)間內(nèi)只有一個(gè)部件能夠訪問消息隊(duì)列中的消息。

             CanRead和CanWrite屬性:決定隊(duì)列是否可以被讀取或者是寫入。
            MaximumQueueSize和MaximumJournalSize屬性:以千字節(jié)為單一個(gè)隊(duì)列(日志隊(duì)列)的消息最大容納量。一旦接收的消息到達(dá)這個(gè)容量,新的消息將不再被接收。
            一般情況下,消息隊(duì)列的最大值為消息隊(duì)列管理員所設(shè)置,如果這個(gè)值沒有控制的話,那么缺省的消息隊(duì)列最大容量將是無限制的。
             UseJournalQueue屬性::設(shè)置是否將收到的消息拷貝到日志消息隊(duì)列中去。


            __________________

            千里之行始于足下

            posted on 2007-03-15 12:11 true 閱讀(852) 評論(0)  編輯 收藏 引用
            伊人久久亚洲综合影院| 亚洲国产精品人久久| 亚洲人AV永久一区二区三区久久| 青青草原综合久久大伊人导航| 伊人久久大香线蕉综合网站| 久久精品中文字幕无码绿巨人| 久久香蕉国产线看观看99| 久久久久99这里有精品10| 久久99热只有频精品8| 久久婷婷五月综合色99啪ak| 久久久久AV综合网成人| 久久婷婷五月综合色99啪ak| 久久精品国产亚洲AV香蕉| 伊人精品久久久久7777| 99久久99久久精品国产片| 午夜人妻久久久久久久久| 久久久精品久久久久特色影视| 日产精品久久久一区二区| 日韩精品无码久久一区二区三| 国产精品久久一区二区三区| 2020久久精品亚洲热综合一本| 国内精品久久久久久久97牛牛| 2020国产成人久久精品 | 国产精品青草久久久久婷婷| 久久播电影网| 久久香蕉国产线看观看乱码| 久久久久99精品成人片试看| 久久久久久国产精品无码下载 | 久久频这里精品99香蕉久| 国产精品福利一区二区久久| 精品久久久久久中文字幕大豆网 | 久久99精品国产99久久| 亚洲精品无码久久久久去q| 久久乐国产精品亚洲综合| 久久综合狠狠综合久久激情 | 99国产精品久久| 久久发布国产伦子伦精品| 久久精品国产清高在天天线| 国产V综合V亚洲欧美久久| 久久精品中文闷骚内射| 99久久无码一区人妻a黑|