C#隊列學習筆記:MSMQ入門一

    1、引言

    MSMQ全稱MicroSoft Message Queue,微軟消息隊列,是在多個不一樣的應用之間實現相互通訊的一種異步傳輸模式,相互通訊的應用能夠分佈於同一臺機器上,也能夠分佈於相連的網絡空間中的任一位置。它的實現原理是:消息的發送者把本身想要發送的信息放入一個容器中(咱們稱之爲Message),而後把它保存至一個系統公用空間的消息隊列(Message Queue)中,本地或者異地的消息接收程序再從該隊列中取出發給它的消息進行處理。html

    消息Message是由通訊的雙方所須要傳遞的信息。消息是MSMQ的存儲對象,封裝爲System.Messaging.Message對象,它由一個主體(body)和若干屬性構成,其中咱們的用戶數據一般被序列化裝入body主體中,這也是咱們稱它爲數據容器的緣由。除了body屬性,還有幾個屬性相對來講比較重要:Priority(消息的優先級),Label(用戶定義的消息標識),Formatter(消息的序列組件,當用戶將複雜類型數據填充到body中,用戶的數據會先被序列化)。安全

    隊列分事務性隊列和非事務性隊列,默認建立的是非事務性隊列。當咱們勾選事務性複選框,就會建立事務性隊列。那麼什麼是事務性隊列呢?事務性隊列將消息保存在磁盤上,實現了持久化,也就是說當關機斷電後,下次再啓動機器,咱們的消息依然保存在隊列裏面,而非事務性隊列則將消息保存在內存中,也就是說重啓電腦後,隊列裏面的消息將不存在了。服務器

    隊列的類型主要包括如下幾種:網絡

    「公共隊列」在整個「消息隊列」網絡中複製,而且有可能由網絡鏈接的全部站點訪問。app

    「專用隊列」不在整個網絡中發佈,相反,它們僅在所駐留的本地計算機上可用。專用隊列只能由知道隊列的完整路徑名或標籤的應用程序訪問。異步

    「管理隊列」包含確認在給定「消息隊列」網絡中發送的消息回執的消息。指定但願 MessageQueue 組件使用的管理隊列(若是有的話)。spa

    「響應隊列」包含目標應用程序接收到消息時返回給發送應用程序的響應消息。指定但願 MessageQueue 組件使用的響應隊列(若是有的話)。3d

    優勢:穩定、消息優先級、脫機能力以及安全性,有保障的消息傳遞和執行許多業務處理的可靠的防故障機制。code

    缺點:MSMQ不適合於Client須要Server端實時交互狀況;大量請求的時候響應延遲。orm

    2、安裝

    在運行中輸入appwiz.cpl->打開或關閉 Windows 功能->Microsoft Message Queue (MSMQ) 服務器。

 

    安裝成功後,在運行中輸入compmgmt.msc->服務和應用程序->消息隊列。

    右鍵消息隊列->屬性,可更改默認存儲路徑等。

    3、示例演示

    注意:需引用System.Messaging。

    class Program
    {
        static void Main(string[] args)
        {
            #region MSMQ入門一
            //建立消息隊列,默認存儲路徑:C:\Windows\System32\msmq\storage
            if (MessageQueue.Exists(@".\Private$\HelloMSMQ"))
                MessageQueue.Delete(@".\Private$\HelloMSMQ");   //刪除消息隊列HelloMSMQ
            if (MessageQueue.Exists(@".\Private$\WorldMSMQ"))
                MessageQueue.Delete(@".\Private$\WorldMSMQ");   //刪除消息隊列WorldMSMQ

            MessageQueue mqHello = MessageQueue.Create(@".\Private$\HelloMSMQ");
            MessageQueue mqWorld = MessageQueue.Create(@".\Private$\WorldMSMQ");

            //發送消息
            mqHello.Send("Hi World,I am Hello.", "mqHello1");
            mqHello.Send("Are you free?", "mqHello2");
            mqWorld.Send("Hi Hello,I am World.", "mqWorld1");
            mqWorld.Send("I guess I'll be free.", "mqWorld2");

            //返回本機全部私有隊列的消息
            foreach (MessageQueue item in MessageQueue.GetPrivateQueuesByMachine("cx168"))
            {
                item.Formatter = new XmlMessageFormatter(new string[] { "System.String" });
                Message[] messages = item.GetAllMessages();
                foreach (Message message in messages)
                {
                    Console.WriteLine($"Label: {message.Label} Body: {message.Body}");
                }
            }

            //返回指定隊列的消息
            if (MessageQueue.Exists(@".\Private$\HelloMSMQ"))
            {
                using (MessageQueue theOne = new MessageQueue(@".\Private$\HelloMSMQ"))
                {
                    Console.WriteLine();

                    //設置消息隊列格式化器
                    theOne.Formatter = new XmlMessageFormatter(new string[] { "System.String" });
                    //接受但不刪除消息
                    Message msg = mqHello.Peek();
                    Console.WriteLine($"Label: {msg.Label} Body: {msg.Body}");
                    //接受並刪除消息
                    msg = mqHello.Receive();
                    Console.WriteLine($"Label: {msg.Label} Body: {msg.Body}");
                    msg = mqHello.Peek();
                    Console.WriteLine($"Label: {msg.Label} Body: {msg.Body}");
                    //刪除全部消息
                    mqHello.Purge();
                    Console.WriteLine($"mqHello count: {mqHello.GetAllMessages().Count()}");
                }
            }

            Console.Read();
            #endregion
        }
    }

    運行結果以下:

 

    參考自:

    https://www.cnblogs.com/tenghoo/archive/2009/11/05/1596456.html

    http://www.javashuo.com/article/p-vomvornf-gp.html

相關文章
相關標籤/搜索