最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MSMQ微軟消息隊列詳解

 更新時間:2022年01月24日 11:57:00   作者:HackerVirus  
本文詳細講解了MSMQ微軟消息隊列,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

一、引言

Windows Communication Foundation(WCF)是Microsoft為構建面向服務的應用程序而提供的統(tǒng)一編程模型,該服務模型提供了支持松散耦合和版本管理的序列化功能,并提供了與消息隊列(MSMQ)、COM+、Asp.net Web服務、.NET Remoting等微軟現(xiàn)有的分布式系統(tǒng)技術。利用WCF平臺,開發(fā)人員可以很方便地構建面向服務的應用程序(SOA)??梢哉J為,WCF是對之前現(xiàn)有的分布式技術(指的是MSMQ、.NET Remoting和Web 服務等技術)的集成和擴展,既然這樣,我們就有必要首先了解下之前分布式技術,只有這樣才能更深刻地明白WCF所帶來的好處。今天就分享下MSMQ這種分布式技術。

二、MSMQ的介紹

MSMQ全稱是Microsoft Message Queue——微軟消息隊列。它是一種異步傳輸模式,可以在不同的應用之間實現(xiàn)相互通信,相互通信的應用可以分布在同一臺機器上,也可以分布于相連的網(wǎng)絡空間中的任一位置。

2.1 MSMQ 工作原理

MSMQ的實現(xiàn)原理是:消息的發(fā)送者把自己想要發(fā)送的信息放入一個容器,然后把它保存到一個系統(tǒng)公用空間的消息隊列中,本地或異地的消息接收程序再從該隊列中取出發(fā)給它的消息進行處理。

消息隊列是一個公用存儲空間,它可以存在于內存中或物理文件中,因此,消息以兩種方式發(fā)送,即快遞方式和可恢復模式。它們的區(qū)別是消息存儲位置的不同,快遞方式,為了消息的快速傳遞,所以把消息放置在內存中,而不放在物理磁盤上,以獲得較高的處理能力;而可恢復模式在傳送過程的每一步驟中,都把消息寫入物理磁盤上,這樣當保存消息隊列的機器發(fā)生故障而重新啟動后,可以把發(fā)送的消息恢復到故障發(fā)送之前的狀態(tài),以獲得更好的消息恢復能力。消息隊列可以放在發(fā)送方、接收方所在的機器上,也可以單獨放置在另外一臺機器上。另外,采用消息隊列機制,發(fā)送方不必要擔心接收方是否啟動,是否發(fā)生故障等因素,只要消息成功發(fā)送出去,就可以認為處理完成,而實際上對方可能甚至未開機,或者實際消息傳遞到對方可能在第二天。MSMQ機制類似QQ消息傳遞機制。下圖演示了MSMQ的實現(xiàn)原理。

MSMQ中主要有兩個概念。

  • 一個是消息Message:Message是通信雙方需要傳遞的消息,它可以是文本、圖片、視頻等。消息包含發(fā)送和接收者的標識,只有指定的用戶才能取得消息。
  • 一個是隊列Queue:用來保存消息的存儲空間,MSMQ中主要包括以下幾種隊列類型:
    • 公共隊列:在整個消息隊列網(wǎng)絡中復制,有可能由網(wǎng)絡連接的所有站點訪問。路徑格式為:機器名稱\隊列名稱
    • 專用隊列(或叫私有隊列):不在整個網(wǎng)絡中發(fā)布,它們僅在所駐留的本地計算機上可用,專用隊列只能由知道隊列的完整路徑名稱或標簽的應用程序訪問。路徑格式為:機器名稱\Private$\隊列名稱
    • 日志隊列:包含確認在給定“消息隊列中發(fā)送的消息回執(zhí)消息”。路徑格式為:機器名稱\隊列名稱\Journal$
    • 響應隊列:包含目標應用程序接收到消息時返回給發(fā)送應用程序的響應消息,包括機器日志隊列、機器死信隊列和機器事務死信隊列。
      • 機器日志隊列對應的格式為:機器名稱\Journal$;
      • 機器死信隊列對應的格式為:機器名稱\Deadletter$;
      • 機器信道死信隊列對應的格式為:機器名稱\XactDeadletter$。

2.2 隊列引用說明

當創(chuàng)建了一個MessageQueue實例之后,就應指明和哪個隊列進行通信,在.NET中有3種訪問指定消息隊列的方法:

  • 使用路徑,消息隊列的路徑被機器名和隊列名唯一確定,所以可以用消息隊列路徑來指明使用的消息隊列。
  • 使用格式名(format name),它是由MSMQ在消息隊列創(chuàng)建時生成的唯一標識,個使命不由用戶指定,而是由隊列管理者自動生成的GUID。
  • 使用標識名(label),它是消息隊列創(chuàng)建時由消息管理者指定的帶有意義的名字。

三、消息隊列的優(yōu)缺點

采用消息隊列的好處是:由于是異步通信,無論是發(fā)送方還是接收方都不同等待對方返回成功消息,就可以執(zhí)行余下的代碼,大大提高了處理的能力;在信息傳遞過程中,具有故障恢復能力;MSMQ的消息傳遞機制使得通信的雙方具有不同的物理平臺成為可能。

消息隊列缺點是不適合Client需要Server端實時交互情況,大量請求時候,響應可能延遲。

四、利用MSMQ開發(fā)分布式應用

4.1 環(huán)境準備

要想在.NET平臺進行MSMQ的開發(fā),需要安裝消息隊列,你需要打開控制面板->程序->打開或關閉Windows功能,勾選消息隊列服務所有選項,具體操作如下圖所示:

勾選完之后點擊確定之后,可以在我的電腦->管理->服務和應用程序->消息隊列 看到下面的圖:

看到上面這個圖代表你已經(jīng)成功配置了MSMQ的開發(fā)環(huán)境,下面就可以使用Visual Studio 進行開發(fā)。注意,對特定類型隊列的操作代碼,一定要成功安裝對應的隊列類型。

4.2 使用MSMQ開發(fā)分布式應用

首先,實現(xiàn)服務器端。創(chuàng)建一個控制臺項目,添加System.Messaging引用,因為消息隊列的類全部封裝在System.Messaging.dll程序集里。具體服務端的代碼如下:

 using System;
 using System.Messaging;
 
 namespace MSMQServer
 {
     class Program
     {  
         static void Main(string[] args)
         {
             // 創(chuàng)建一個公共隊列,公共隊列只能創(chuàng)建在域環(huán)境里
             //if (!MessageQueue.Exists(@".\LearningHardMSMQ")) // 判斷此路徑下是否已經(jīng)有該隊列
             //{
             //    using (MessageQueue mq = MessageQueue.Create(@".\LearningHardMSMQ"))
             //    {
             //        mq.Label = "LearningHardQueue"; // 設置隊列標簽
             //        Console.WriteLine("已經(jīng)創(chuàng)建了一個公共隊列");
             //        Console.WriteLine("路徑為:{0}", mq.Path);
             //        Console.WriteLine("隊列名字為:{0}", mq.QueueName);
             //        mq.Send("MSMQ Message", "Leaning Hard"); // 發(fā)送消息
             //    }
             //}
 
             //if (MessageQueue.Exists(@".\Private$\LearningHardMSMQ"))
             //{
                   // 刪除消息隊列
             //    MessageQueue.Delete(@".\Private$\LearningHardMSMQ");
             //}
             // 創(chuàng)建一個私有消息隊列
             if (!MessageQueue.Exists(@".\Private$\LearningHardMSMQ"))
             {
                 using (MessageQueue mq = MessageQueue.Create(@".\Private$\LearningHardMSMQ"))
                 {
                     mq.Label = "LearningHardPrivateQueue"; 
                     Console.WriteLine("已經(jīng)創(chuàng)建了一個私有隊列");
                     Console.WriteLine("路徑為:{0}", mq.Path);
                     Console.WriteLine("私有隊列名字為:{0}", mq.QueueName);
                     mq.Send("MSMQ Private Message", "Leaning Hard"); // 發(fā)送消息
                 }
             }
 
             // 遍歷所有的公共消息隊列
             //foreach (MessageQueue mq in MessageQueue.GetPublicQueues())
             //{
             //    mq.Send("Sending MSMQ public message" + DateTime.Now.ToLongDateString(), "Learning Hard");
             //    Console.WriteLine("Public Message is sent to {0}", mq.Path);
             //}
            
             if (MessageQueue.Exists(@".\Private$\LearningHardMSMQ")) 
             {
                 // 獲得私有消息隊列
                 MessageQueue mq = new MessageQueue(@".\Private$\LearningHardMSMQ");
                 mq.Send("Sending MSMQ private message" + DateTime.Now.ToLongDateString(), "Leaning Hard");
                 Console.WriteLine("Private Message is sent to {0}", mq.Path);
             }
 
             Console.Read();
         }
     }
 }

服務器端代碼需要注意的是,公共隊列只能在域環(huán)境中創(chuàng)建,由于我的個人電腦沒有加入域環(huán)境,所以不能創(chuàng)建公共隊列,從開始的消息隊列的截圖也可以看出,在圖中并沒有安裝公共隊列。

實現(xiàn)完服務器端之后,自然就是完成客戶端。MSMQ程序的原理主要是:服務器端把消息發(fā)送到共享的消息隊列中,然后,客戶端從這個共享的消息隊列中取出消息進行處理。具體客戶端的實現(xiàn)代碼如下所示:

 using System;
 using System.Messaging; // 需要添加System.Messaging引用
 
 namespace MSMQClient
 {
     class Program
     {
         static void Main(string[] args)
         {
             if (MessageQueue.Exists(@".\Private$\LearningHardMSMQ"))
             {
                 // 創(chuàng)建消息隊列對象
                 using (MessageQueue mq = new MessageQueue(@".\Private$\LearningHardMSMQ"))
                 {
                     // 設置消息隊列的格式化器
                     mq.Formatter = new XmlMessageFormatter(new string[] { "System.String" });
                     foreach (Message msg in mq.GetAllMessages())
                     {
                         Console.WriteLine("Received Private Message is: {0}", msg.Body);
                     }
 
                     Message firstmsg = mq.Receive(); // 獲得消息隊列中第一條消息
                     Console.WriteLine("Received The first Private Message is: {0}", firstmsg.Body);
                 }
             }
             Console.Read();
         }
     }
 }

4.3 運行演示

經(jīng)過上面步驟,我們已經(jīng)完成了MSMQ分布式程序的實現(xiàn)了,下面看看如何運行該程序來查看效果。

首先,自然要啟動服務器,右鍵MSMQServer項目->調試->啟動新實例來啟動服務器,具體步驟如下圖所示:

運行成功之后,你將到服務器發(fā)送消息成功的控制臺界面,效果圖如下所示:

接下來運行客戶端來從消息隊列中取得消息并顯示在控制臺中,采用和服務器相同的方式來啟動客戶端,右鍵MSMQClient->調試->啟動新實例,看到客戶端的效果如下圖所示:

從上圖可以看出,客戶端確實成功地取得了消息隊列中的消息。

以上MSMQ程序需要特別注意是:MessageQueue.Receive()是取出消息隊列中隊列中的第一條消息,并從消息隊列中移除它(MSDN中文翻譯上是錯誤,MSDN寫的是不移除,而英文原文是移除),而實際結果也是移除的,如果你再運行一次客戶端時,你會發(fā)現(xiàn)消息隊列中只有一條消息,具體運行效果如下圖所示:

五、總結

到這里,MSMQ的內容就分享結束, 其MSMQ的實現(xiàn)原理也非常簡單,一句話慨括就是服務器把消息放在一個公共的地方,這個地方叫做消息隊列,而其他客戶端可以從這個地方取出消息進行處理。下一章將分享.NET 平臺上另外一種分布式技術——.NET Remoting。

本文的示例代碼文件:MSMQSample。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • .Net結構型設計模式之裝飾模式(Decorator)

    .Net結構型設計模式之裝飾模式(Decorator)

    這篇文章介紹了.Net結構型設計模式之裝飾模式(Decorator),文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-05-05
  • 微軟 Visual Studio 2010官方下載地址給大家

    微軟 Visual Studio 2010官方下載地址給大家

    昨天VS2010在網(wǎng)上報道都已經(jīng)發(fā)布了,現(xiàn)在今天在網(wǎng)上找到Visual Studio 2010官方下載地址,提供給大家下載。
    2010-04-04
  • WPF中Style樣式及其觸發(fā)器

    WPF中Style樣式及其觸發(fā)器

    這篇文章介紹了WPF中Style樣式及其觸發(fā)器,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-01-01
  • ASP.NET中Cookie的使用方法

    ASP.NET中Cookie的使用方法

    Cookie是一段文本信息,在客戶端存儲 Cookie 是 ASP.NET 的會話狀態(tài)將請求與會話關聯(lián)的方法之一。瀏覽器對 Cookie 的大小有限制,因此,只有不超過 4096 字節(jié)才能保證被接受。
    2016-04-04
  • ASP.NET Core中間件

    ASP.NET Core中間件

    這篇文章介紹了ASP.NET Core的中間件,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-04-04
  • ASP.NET?MVC模式中應用程序結構詳解

    ASP.NET?MVC模式中應用程序結構詳解

    本文詳細講解了ASP.NET?MVC模式中的應用程序結構,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-03-03
  • .Net行為型設計模式之命令模式(Command)

    .Net行為型設計模式之命令模式(Command)

    這篇文章介紹了.Net行為型設計模式之命令模式(Command),文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-05-05
  • .Net行為型設計模式之訪問者模式(Visitor)

    .Net行為型設計模式之訪問者模式(Visitor)

    這篇文章介紹了.Net行為型設計模式之訪問者模式(Visitor),文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-05-05
  • 為ABP框架配置數(shù)據(jù)庫

    為ABP框架配置數(shù)據(jù)庫

    這篇文章介紹了為ABP框架配置數(shù)據(jù)庫的方法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-02-02
  • ABP框架的體系結構及模塊系統(tǒng)講解

    ABP框架的體系結構及模塊系統(tǒng)講解

    ABP框架是基于ASP.NET的Web開發(fā)框架,不過它遵循一種名為DDD(領域驅動設計)的設計模式原則,接下來我們就來看一下ABP框架的體系結構及模塊系統(tǒng)講解
    2016-06-06

最新評論

玉林市| 化隆| 乌拉特后旗| 遵义县| 宣恩县| 武强县| 阜新| 阜阳市| 清镇市| 交口县| 锡林郭勒盟| 新邵县| 古浪县| 金沙县| 安龙县| 新余市| 玉环县| 文成县| 文安县| 香河县| 长沙市| 曲阳县| 禄劝| 滦平县| 西平县| 信丰县| 鄂托克旗| 石景山区| 房产| 道真| 高陵县| 安西县| 绥宁县| 本溪| 钟祥市| 抚顺市| 基隆市| 恩平市| 太仓市| 武鸣县| 丹东市|