NET中的訊息佇列

來源:互聯網
上載者:User
下文參考:http://hi.baidu.com/21tian/blog/item/ce5464097ddf10cb3ac76335.html
為何使用訊息佇列

您可能認為您能夠通過一個簡單的資料庫表(一個應用程式往其中寫入資料,另一個應用程式從中讀取資料)來應用訊息佇列。訊息佇列平台更為穩定,因為它們通常擁有自己的安全機制、事務支援及其它功能。傳輸訊息的路由功能是它的一個關鍵應用。MSMQ提供各種訊息佇列平台。

MSMQ簡介

MSMQ是Windows 2000、Windows XP、Windows Server 2003的一個組件,並將繼續包含在Windows Vista和以後的Windows伺服器中。即使目標接收應用程式沒有運行,或運行發送或接收應用程式的電腦沒有連網,協同合作的應用程式仍能利用MSMQ在彼此之間發送和接收訊息。在到達目標隊列之前,訊息由MSMQ儲存並轉寄。接收應用程式能夠從隊列中恢複資料。

MSMQ之類訊息佇列的主要特點在於它分離發送和接收應用程式,使其不必同時運行。這意味著一個應用程式能夠把資料存放在隊列中,而不用理會隊列中的項目是否被傳送到接收應用程式。

MSMQ是Windows的一個可選組件,只需通過Windows控制台的添加或刪除Windows組件嚮導就可進行安裝。MSMQ有兩種配置模式:域模式或工作群組模式(只使用私人隊列)。MSMQ安裝完成後,立即就可以在.NET應用程式中運行。

MSMQ互動

開發基於訊息的應用程式從隊列開始。MSMQ包含四種隊列類型:

  • 外發隊列:訊息發送到目的地之前,用它來臨時儲存訊息。
  • 公用隊列:在主動目錄中公布。整個網路各種伺服器上的應用程式能夠通過主動目錄找到並應用公用隊列。
  • 私人隊列:這些是本機伺服器上的隊列,對其它伺服器無效(因此這些隊列不在主動目錄中公布。)
  • 系統隊列:包含日記隊列(由系統產生)、死隊列和事務型無效信件佇列。死訊息無法傳送。

System.Messaging命名空間執行MSMQ的編程操作。這個命名空間有兩個主要的對象:

  • Message:隊列發送或讀取的實際訊息或資料。
  • MessageQueue:接收/發送訊息的MSMQ訊息佇列。
  • MSMQ編程

    建立一個隊列是應用MSMQ的第一步。您可以通過Windows電腦管理主控台中的訊息佇列選項完成這一操作,或者自己編程建立一個隊列。列表A中的C#代碼建立了一個新的私人MSMQ訊息佇列(如果不存在隊列),並同時建立一條訊息。

    代碼應用MessageQueue類的Exists方法來確定是否存在一個名為TechRepublic的私人隊列。如存在,它用現有隊列樣本這個MessageQueue對象;否則,就建立一個新隊列。

    新的Message對象用來向隊列發送一條訊息。它的Label屬性指定在MSMQ控制台中顯示的訊息標題,其主體包含存放在隊列上的項目內容。在這種情況下,我只發送文本,但您能夠使用任何類型的對象。MessageQueue類的Send方法向隊列發送訊息。列表B中是對應的VB.NET代碼。

    下一步即從隊列中讀取訊息。這是一個簡單的過程,應用MessageQueue類的Receive方法即可。如果隊列中存在訊息,Receive方法就返回一個訊息對象;否則,它等待一條訊息出現(您可以設定一個時間期限)。從隊列中恢複對象需要預Crowdsourced Security Testing道它的類型。

    MessageQueue類的Formatter屬性允許您輕鬆指定被恢複對象的類型。下面的簡單例子僅使用文本,所以它應用System.String。在列表C中,C#代碼從測試隊列中讀取訊息。

    提交給Receive方法的TimeSpan對象指定異常出現時系統的等待時間。接下來設定這個例子中的Formatter方法,對象被轉換成字串讀取前面儲存的文本。Receive方法從隊列中讀取訊息,它的值顯示在控制台中。在try塊的最後部分,隊列關閉。

    輕鬆應用訊息

    MSMQ組合Windows和.NET的System.Messaging命名空間,使您可以方便地在.NET應用程式中利用訊息。訊息提供一種在公司專屬應用程式程式中非同步發送並接收訊息(資料)的強大工具。

以下試文章來源
http://hi.baidu.com/sanlng/blog/item/5fc5bb510d4faa2043a75b28.html
三、發送資訊

    1、發送簡單訊息

    在訊息發送前,首先要執行個體化MessageQueue的一個執行個體並指定其所對應的隊列。如下代碼

            //執行個體化MessageQueue,並指向現有的一個名稱為VideoQueue隊列
            MessageQueue MQ = new MessageQueue(@".\private$\VideoQueue");
            MQ.Send("訊息測試","測試訊息");

(代碼片斷1)


    2、發送複雜訊息

    VideoPath是將要被當作訊息的Boby來進行傳遞的類型,其定義如下:
    using System;
    namespace Message.Bussiness
    {
        [Serializable]
        public class VideoPath
        {
            string _sourceFilePath = string.Empty;
            string _targetFilePath = string.Empty;

            public VideoPath()
            {
            }

            public VideoPath(string sourceFilePath,string targetFilePath)
            {
                this._sourceFilePath = sourceFilePath;
                this._targetFilePath = targetFilePath;
            }

            public string SourceFilePath
            {
                get
                {
                    return this._sourceFilePath;
                }
                set
                {
                    this._sourceFilePath= value;   
                }
            }

            public string TargetFilePath
            {
                get
                {
                    return this._targetFilePath;
                }
                set
                {
                    this._targetFilePath = value;   
                }
            }
        }
    }

(代碼片斷2)

       對該類的要求是,該類必須要有一個預設無參的公用建構函式,所有屬性必須是可讀寫的,且該類必須可以被序列化。利用Message將訊息發送到隊列中。

            MessageQueue MQ = new MessageQueue(@".\private$\VideoQueue");
            VideoPath VPath = new VideoPath(Path.Combine(Server.MapPath("."),"Video\\output.wmv"),Path.Combine(Server.MapPath("."),"Flv\\output.flv"));
            System.Messaging.Message message = new System.Messaging.Message();
            message.Label = "視頻轉換所用訊息";
            message.Body = VPath;
            MQ.Send(message);

(代碼片斷3)

四、接收訊息

1、接收簡單類型的訊息

2、接收複雜類型的訊息
        對於“代碼片斷3”所示的訊息,在接收時可按如下方法:
            MessageQueue MQ = new MessageQueue(@".\private$\VideoQueue");
             //調用MessageQueue的Receive方法接收訊息
            System.Messaging.Message message = MQ.Receive( TimeSpan.FromSeconds(5));
            if ( message != null )
            {
                message.Formatter = new System.Messaging.XmlMessageFormatter(new string[]{"Message.Bussiness.VideoPath,Message"});
                VideoPath Vpath = (VideoPath)message.Body;
                Response.Write(Vpath.SourceFilePath);
            }
            else
            {
                Response.Write("沒有找到訊息!");
            }

       需要注意的是,如果訊息是一個自訂類型對象時,必須指定Message的序列化器,即Formatter屬性。不合適的Formatter是無法正確還原序列化訊息的。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.