MSMQ (Microsoft消息隊列)是Windows中默承認用的消息隊列。做爲跨計算機系統發送和接收消息的可靠方法,MSMQ提供了一個可伸縮、線程安全、簡單和使用方便的隊列,同時爲你提供了在Windows數據庫中持久化消息的機會。MSDN指出:「消息隊列(MSMQ)技術使在不一樣時間運行的應用程序可以在可能暫時離線的異構網絡和系統之間進行通訊。應用程序將消息發送到隊列並從隊列讀取消息。」html
在使用MSMQ時,一般有兩個不一樣的應用程序——發送者和接收者。當消息由發送者發送時,接收者應用程序不須要處於執行狀態——消息實際上存儲在由主機操做系統維護的隊列中,當接收方應用程序須要它們時,這些消息就會脫離隊列。數據庫
建立一個隊列編程
你能夠經過控制面板上的「打開或關閉Windows功能」選項打開你係統中的MSMQ。在系統中安裝了MSMQ以後,建立隊列就很簡單了。只要到「個人電腦」,右擊並選擇管理。在「計算機管理」窗口中,你能夠從「消息隊列」節點建立一個新隊列。還能夠經過編程方式建立隊列。c#
C#中的MSMQ安全
要使用MSMQ,你須要引入System.Messaging命名空間。要以編程方式建立隊列,須要利用MessageQueue類的Create方法。下面的代碼片斷說明了這一點。網絡
MessageQueue.Create(@".\Private$\IDG");
要建立隊列並向其發送消息,可使用如下代碼片斷:spa
messageQueue = new MessageQueue(@".\Private$\IDG"); messageQueue.Label = "This is a test queue."; messageQueue.Send("This is a test message.", "IDG");
如今,假設你想檢查隊列是否存在,若是存在,則發送一條消息給它。若是隊列不存在,你可能但願建立一個新隊列,而後向它發送消息。這正是下面的代碼清單所作的。操作系統
static void Main(string[] args) { MessageQueue messageQueue = null; string description = "This is a test queue."; string message = "This is a test message."; string path = @".\Private$\IDG"; try { if (MessageQueue.Exists(path)) { messageQueue = new MessageQueue(path); messageQueue.Label = description; } else { MessageQueue.Create(path); messageQueue = new MessageQueue(path); messageQueue.Label = description; } messageQueue.Send(message); } catch { throw; } finally { messageQueue.Dispose(); } }
下面的代碼清單演示瞭如何使用c#處理存儲在消息隊列中的消息。線程
private static List<string> ReadQueue(string path) { List<string> lstMessages = new List<string>(); using (MessageQueue messageQueue = new MessageQueue(path)) { System.Messaging.Message[] messages = messageQueue.GetAllMessages(); foreach (System.Messaging.Message message in messages) { message.Formatter = new XmlMessageFormatter( new String[] { "System.String, mscorlib" }); string msg = message.Body.ToString(); lstMessages.Add(msg); } } return lstMessages; }
接下來,能夠調用ReadQueue方法來檢索存儲在消息隊列中的消息,以下面的代碼片斷所示。日誌
string path = @".\Private$\IDG"; List<string> lstMessages = ReadQueue(path);
你還能夠在消息隊列中存儲對象。例如,假設你須要將日誌消息存儲到隊列中。日誌消息存儲在LogMessage類的一個實例中,該實例包含與日誌消息的詳細信息相關的必要屬性。下面是LogMessage類——我只使用了兩個屬性來使它變得簡單。
public class LogMessage { public string MessageText { get; set; } public DateTime MessageTime { get; set; } }
你應該修改LogMessage類,以包含其餘必要的屬性,例如,消息嚴重性等。下面的方法說明了如何將LogMessage類的實例存儲到消息隊列中。
private static void SendMessage(string queueName, LogMessage msg) { MessageQueue messageQueue = null; if (!MessageQueue.Exists(queueName)) messageQueue = MessageQueue.Create(queueName); else messageQueue = new MessageQueue(queueName); try { messageQueue.Formatter = new XmlMessageFormatter(new Type[] { typeof(LogMessage) }); messageQueue.Send(msg); } catch { //Write code here to do the necessary error handling. } finally { messageQueue.Close(); } }
下面的代碼片斷說明了如何建立LogMessage類的實例,向其填充數據,而後調用SendMessage方法來存儲在消息隊列中建立的實例。
LogMessage msg = new LogMessage() { MessageText = "This is a test message.", MessageTime = DateTime.Now }; SendMessage(@".\Private$\IDGLog", msg);
下面的代碼清單演示瞭如何讀取存儲在消息隊列中的LogMessage實例。
private static LogMessage ReceiveMessage(string queueName) { if (!MessageQueue.Exists(queueName)) return null; MessageQueue messageQueue = new MessageQueue(queueName); LogMessage logMessage = null; try { messageQueue.Formatter = new XmlMessageFormatter(new Type[] { typeof(LogMessage) }); logMessage = (LogMessage)messageQueue.Receive().Body; } catch { } finally { messageQueue.Close(); } return logMessage; }
歡迎關注個人公衆號,若是你有喜歡的外文技術文章,能夠經過公衆號留言推薦給我。
原文連接:https://www.infoworld.com/article/3060115/how-to-work-with-msmq-in-c.html