如何在C#中使用MSMQ

  • 2021 年 1 月 25 日
  • 筆記

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;
}

 

歡迎關注我的公眾號,如果你有喜歡的外文技術文章,可以通過公眾號留言推薦給我。

 

原文鏈接://www.infoworld.com/article/3060115/how-to-work-with-msmq-in-c.html