MSMQ (Microsoft訊息佇列)是Windows中預設可用的訊息佇列。作為跨計算機系統傳送和接收訊息的可靠方法,MSMQ提供了一個可伸縮、執行緒安全、簡單和使用方便的佇列,同時為你提供了在Windows資料庫中持久化訊息的機會。MSDN指出:“訊息佇列(MSMQ)技術使在不同時間執行的應用程式能夠在可能暫時離線的異構網路和系統之間進行通訊。應用程式將訊息傳送到佇列並從佇列讀取訊息。”
在使用MSMQ時,通常有兩個不同的應用程式——傳送者和接收者。當訊息由傳送者傳送時,接收者應用程式不需要處於執行狀態——訊息實際上儲存在由主機作業系統維護的佇列中,當接收方應用程式需要它們時,這些訊息就會脫離佇列。
建立一個佇列
你可以通過控制皮膚上的“開啟或關閉Windows功能”選項開啟你係統中的MSMQ。在系統中安裝了MSMQ之後,建立佇列就很簡單了。只要到“我的電腦”,右擊並選擇管理。在“計算機管理”視窗中,你可以從“訊息佇列”節點建立一個新佇列。還可以通過程式設計方式建立佇列。
C#中的MSMQ
要使用MSMQ,你需要引入System.Messaging名稱空間。要以程式設計方式建立佇列,需要利用MessageQueue類的Create方法。下面的程式碼片段說明了這一點。
MessageQueue.Create(@".\Private$\IDG");
要建立佇列並向其傳送訊息,可以使用以下程式碼片段:
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