首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

WCF 分散式開發必備知識 (一):MSMQ 訊息佇列基礎與實作

     編輯:關於.NET

為什麼學 WCF 仍需懂 MSMQ?

WCF 整合了 .NET 所有分散式技術,但技術更替非一蹴而就,既有系統維護、文獻閱讀、問題診斷都需要扎實的基礎知識。

MSMQ 核心概念

Microsoft Message Queue (MSMQ):異步傳輸模式,支援同機器或跨網路應用間通訊。發送者將訊息置入佇列,接收者稍後從佇列取出處理 —— 典型「存儲轉發」模型。

兩大核心物件

  • Message:承載資料 (文字、聲音、圖片等),雙方約定格式 (隱含加密、節省頻寬),含發送/接收者標識、時間戳、截止時間。
  • Queue:訊息公共存儲 (記憶體或實體檔案)。支援快遞 (記憶體) 與可恢復 (磁碟) 兩種模式。

佇列類型

類型特性
公用佇列全網路複寫,所有站點可存取
私有佇列僅本機可見,需完整路徑/標籤存取
管理佇列存放回執確認訊息
回應佇列接收端返回的回應訊息

優缺點

  • 優點:穩定、優先級、離線能力、安全性、保證送達、容錯
  • 缺點:不適合即時互動,大量請求時回應延遲

鬆耦合特性使其成為 SOA 實現方式之一。

開發環境安裝

控制台 → 新增/移除 Windows 元件 → 訊息佇列。安裝後可在「電腦管理 → 服務與應用程式 → 訊息佇列」查看。

安裝元件

管理介面

程式碼實作

參考組件

System.Messaging.dll

伺服端:建立佇列與發送訊息

static void Main()
{
    // 公用佇列
    if (!MessageQueue.Exists(@".\FrankMSMQ"))
        using (var mq = MessageQueue.Create(@".\FrankMSMQ"))
        {
            mq.Label = "FrankPublicQueue";
            mq.Send("MSMQ Message", "Frank.Xu");
        }

    // 私有佇列
    if (!MessageQueue.Exists(@".\Private$\FrankMSMQ"))
        using (var mq = MessageQueue.Create(@".\Private$\FrankMSMQ"))
        {
            mq.Label = "FrankPrivateQueue";
            mq.Send("MSMQ Private Message", "Frank.Xu");
        }

    // 向所有公用佇列發送
    foreach (var mq in MessageQueue.GetPublicQueues())
        mq.Send("Sending MSMQ public message " + DateTime.Now.ToLongDateString(), "Frank.Xu");

    // 向特定私有佇列發送
    if (MessageQueue.Exists(@".\Private$\FrankMSMQ"))
        new MessageQueue(@".\Private$\FrankMSMQ")
            .Send("Sending MSMQ private message " + DateTime.Now.ToLongDateString(), "Frank.Xu");

    Console.Read();
}

客戶端:接收訊息

static void Main()
{
    // 公用佇列
    if (MessageQueue.Exists(@".\FrankMSMQ"))
        using (var mq = new MessageQueue(@".\FrankMSMQ"))
        {
            mq.Formatter = new XmlMessageFormatter(new[] { "System.String" });
            Message msg = mq.Receive();
            Console.WriteLine("Received: {0}", msg.Body);
        }

    // 私有佇列
    if (MessageQueue.Exists(@".\Private$\FrankMSMQ"))
        using (var mq = new MessageQueue(@".\Private$\FrankMSMQ"))
        {
            mq.Formatter = new XmlMessageFormatter(new[] { "System.String" });
            Message msg = mq.Receive();
            Console.WriteLine("Received Private: {0}", msg.Body);
        }
    Console.Read();
}

關鍵點

  • MessageQueue.Create 建立佇列,路徑格式:.\QueueName (公用)、.\Private$\QueueName (私有)。
  • Formatter 必須設定:XmlMessageFormatter (XML 序列化)、BinaryMessageFormatter (二進位)、ActiveXMessageFormatter (COM 相容)。
  • 發送複雜物件需標記 [Serializable]。
  • 事務佇列可確保訊息唯一次送達與順序。

下一篇將介紹 .NET Remoting 基礎與開發實作。

完整代碼下載:MSMQ.rar

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved