一、引言 MSMQ全稱MicroSoft Message Queue,微軟消息隊列,是在多個不同的應用之間實現相互通信的一種非同步傳輸模式,相互通信的應用可以分佈於同一臺機器上,也可以分佈於相連的網路空間中的任一位置。它的實現原理是:消息的發送者把自己想要發送的信息放入一個容器中(我們稱之為Messa ...
一、引言
MSMQ全稱MicroSoft Message Queue,微軟消息隊列,是在多個不同的應用之間實現相互通信的一種非同步傳輸模式,相互通信的應用可以分佈於同一臺機器上,也可以分佈於相連的網路空間中的任一位置。它的實現原理是:消息的發送者把自己想要發送的信息放入一個容器中(我們稱之為Message),然後把它保存至一個系統公用空間的消息隊列(Message Queue)中,本地或者異地的消息接收程式再從該隊列中取出發給它的消息進行處理。
消息Message是由通信的雙方所需要傳遞的信息。
隊列的類型主要包括以下幾種:
“公共隊列”在整個“消息隊列”網路中複製,並且有可能由網路連接的所有站點訪問。
“專用隊列”不在整個網路中發佈,相反,它們僅在所駐留的本地電腦上可用。專用隊列只能由知道隊列的完整路徑名或標簽的應用程式訪問。
“管理隊列”包含確認在給定“消息隊列”網路中發送的消息回執的消息。指定希望 MessageQueue 組件使用的管理隊列(如果有的話)。
“響應隊列”包含目標應用程式接收到消息時返回給發送應用程式的響應消息。指定希望 MessageQueue 組件使用的響應隊列(如果有的話)。
優點:穩定、消息優先順序、離線能力以及安全性,有保障的消息傳遞和執行許多業務處理的可靠的防故障機制。
缺點:MSMQ不適合於Client需要Server端實時交互情況;大量請求的時候響應延遲。
二、安裝
在運行中輸入appwiz.cpl->打開或關閉 Windows 功能->Microsoft Message Queue (MSMQ) 伺服器。
安裝成功後,在運行中輸入compmgmt.msc->服務和應用程式->消息隊列。
右鍵消息隊列->屬性,可更改預設存儲路徑等。
三、示例演示
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"); mqHello.Send("Hi Hello,I am World.", "mqWorld1"); mqHello.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