在C#中使用MSMQ的方法
MSMQ (Microsoft消息隊列)是Windows中默認(rèn)可用的消息隊列。作為跨計算機(jī)系統(tǒng)發(fā)送和接收消息的可靠方法,MSMQ提供了一個可伸縮、線程安全、簡單和使用方便的隊列,同時為你提供了在Windows數(shù)據(jù)庫中持久化消息的機(jī)會。MSDN指出:“消息隊列(MSMQ)技術(shù)使在不同時間運(yùn)行的應(yīng)用程序能夠在可能暫時離線的異構(gòu)網(wǎng)絡(luò)和系統(tǒng)之間進(jìn)行通信。應(yīng)用程序?qū)⑾l(fā)送到隊列并從隊列讀取消息。”
在使用MSMQ時,通常有兩個不同的應(yīng)用程序——發(fā)送者和接收者。當(dāng)消息由發(fā)送者發(fā)送時,接收者應(yīng)用程序不需要處于執(zhí)行狀態(tài)——消息實(shí)際上存儲在由主機(jī)操作系統(tǒng)維護(hù)的隊列中,當(dāng)接收方應(yīng)用程序需要它們時,這些消息就會脫離隊列。
創(chuàng)建一個隊列
你可以通過控制面板上的“打開或關(guān)閉Windows功能”選項(xiàng)打開你系統(tǒng)中的MSMQ。在系統(tǒng)中安裝了MSMQ之后,創(chuàng)建隊列就很簡單了。只要到“我的電腦”,右擊并選擇管理。在“計算機(jī)管理”窗口中,你可以從“消息隊列”節(jié)點(diǎn)創(chuàng)建一個新隊列。還可以通過編程方式創(chuàng)建隊列。
C#中的MSMQ
要使用MSMQ,你需要引入System.Messaging命名空間。要以編程方式創(chuàng)建隊列,需要利用MessageQueue類的Create方法。下面的代碼片段說明了這一點(diǎn)。
MessageQueue.Create(@".\Private$\IDG");
要創(chuàng)建隊列并向其發(fā)送消息,可以使用以下代碼片段:
messageQueue = new MessageQueue(@".\Private$\IDG");
messageQueue.Label = "This is a test queue.";
messageQueue.Send("This is a test message.", "IDG");
現(xiàn)在,假設(shè)你想檢查隊列是否存在,如果存在,則發(fā)送一條消息給它。如果隊列不存在,你可能希望創(chuàng)建一個新隊列,然后向它發(fā)送消息。這正是下面的代碼清單所做的。
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;
}
接下來,可以調(diào)用ReadQueue方法來檢索存儲在消息隊列中的消息,如下面的代碼片段所示。
string path = @".\Private$\IDG"; List<string> lstMessages = ReadQueue(path);
你還可以在消息隊列中存儲對象。例如,假設(shè)你需要將日志消息存儲到隊列中。日志消息存儲在LogMessage類的一個實(shí)例中,該實(shí)例包含與日志消息的詳細(xì)信息相關(guān)的必要屬性。下面是LogMessage類——我只使用了兩個屬性來使它變得簡單。
public class LogMessage
{
public string MessageText { get; set; }
public DateTime MessageTime { get; set; }
}
你應(yīng)該修改LogMessage類,以包含其他必要的屬性,例如,消息嚴(yán)重性等。下面的方法說明了如何將LogMessage類的實(shí)例存儲到消息隊列中。
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();
}
}
下面的代碼片段說明了如何創(chuàng)建LogMessage類的實(shí)例,向其填充數(shù)據(jù),然后調(diào)用SendMessage方法來存儲在消息隊列中創(chuàng)建的實(shí)例。
LogMessage msg = new LogMessage()
{
MessageText = "This is a test message.",
MessageTime = DateTime.Now
};
SendMessage(@".\Private$\IDGLog", msg);
下面的代碼清單演示了如何讀取存儲在消息隊列中的LogMessage實(shí)例。
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;
}
以上就是在C#中使用MSMQ的方法的詳細(xì)內(nèi)容,更多關(guān)于c# 使用msmq的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C#中結(jié)構(gòu)體和字節(jié)數(shù)組轉(zhuǎn)換實(shí)現(xiàn)
這篇文章主要介紹了C#中結(jié)構(gòu)體和字節(jié)數(shù)組轉(zhuǎn)換實(shí)現(xiàn),本文直接給出了字節(jié)數(shù)組與結(jié)構(gòu)體的轉(zhuǎn)換代碼,代碼中包含詳細(xì)注釋,需要的朋友可以參考下2015-06-06
C# string格式的日期時間字符串轉(zhuǎn)為DateTime類型的方法
這篇文章主要介紹了C# string格式的日期時間字符串轉(zhuǎn)為DateTime類型的方法,需要的朋友可以參考下2017-02-02
Winform界面中實(shí)現(xiàn)通用工具欄按鈕的事件處理方法
下面小編就為大家分享一篇Winform界面中實(shí)現(xiàn)通用工具欄按鈕的事件處理方法,具有很好的參考價值,希望對大家有所幫助2017-11-11
淺談c#.net中巧用ToString()將日期轉(zhuǎn)成想要的格式
有時候我們要對時間進(jìn)行轉(zhuǎn)換,達(dá)到不同的顯示效果,更多的該怎么辦呢?2013-03-03

