在C#中使用MSMQ的方法
MSMQ (Microsoft消息隊(duì)列)是Windows中默認(rèn)可用的消息隊(duì)列。作為跨計(jì)算機(jī)系統(tǒng)發(fā)送和接收消息的可靠方法,MSMQ提供了一個(gè)可伸縮、線程安全、簡(jiǎn)單和使用方便的隊(duì)列,同時(shí)為你提供了在Windows數(shù)據(jù)庫(kù)中持久化消息的機(jī)會(huì)。MSDN指出:“消息隊(duì)列(MSMQ)技術(shù)使在不同時(shí)間運(yùn)行的應(yīng)用程序能夠在可能暫時(shí)離線的異構(gòu)網(wǎng)絡(luò)和系統(tǒng)之間進(jìn)行通信。應(yīng)用程序?qū)⑾l(fā)送到隊(duì)列并從隊(duì)列讀取消息?!?/p>
在使用MSMQ時(shí),通常有兩個(gè)不同的應(yīng)用程序——發(fā)送者和接收者。當(dāng)消息由發(fā)送者發(fā)送時(shí),接收者應(yīng)用程序不需要處于執(zhí)行狀態(tài)——消息實(shí)際上存儲(chǔ)在由主機(jī)操作系統(tǒng)維護(hù)的隊(duì)列中,當(dāng)接收方應(yīng)用程序需要它們時(shí),這些消息就會(huì)脫離隊(duì)列。
創(chuàng)建一個(gè)隊(duì)列
你可以通過控制面板上的“打開或關(guān)閉Windows功能”選項(xiàng)打開你系統(tǒng)中的MSMQ。在系統(tǒng)中安裝了MSMQ之后,創(chuàng)建隊(duì)列就很簡(jiǎn)單了。只要到“我的電腦”,右擊并選擇管理。在“計(jì)算機(jī)管理”窗口中,你可以從“消息隊(duì)列”節(jié)點(diǎn)創(chuàng)建一個(gè)新隊(duì)列。還可以通過編程方式創(chuàng)建隊(duì)列。
C#中的MSMQ
要使用MSMQ,你需要引入System.Messaging命名空間。要以編程方式創(chuàng)建隊(duì)列,需要利用MessageQueue類的Create方法。下面的代碼片段說明了這一點(diǎn)。
MessageQueue.Create(@".\Private$\IDG");
要?jiǎng)?chuàng)建隊(duì)列并向其發(fā)送消息,可以使用以下代碼片段:
messageQueue = new MessageQueue(@".\Private$\IDG"); messageQueue.Label = "This is a test queue."; messageQueue.Send("This is a test message.", "IDG");
現(xiàn)在,假設(shè)你想檢查隊(duì)列是否存在,如果存在,則發(fā)送一條消息給它。如果隊(duì)列不存在,你可能希望創(chuàng)建一個(gè)新隊(duì)列,然后向它發(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#處理存儲(chǔ)在消息隊(duì)列中的消息。
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方法來檢索存儲(chǔ)在消息隊(duì)列中的消息,如下面的代碼片段所示。
string path = @".\Private$\IDG"; List<string> lstMessages = ReadQueue(path);
你還可以在消息隊(duì)列中存儲(chǔ)對(duì)象。例如,假設(shè)你需要將日志消息存儲(chǔ)到隊(duì)列中。日志消息存儲(chǔ)在LogMessage類的一個(gè)實(shí)例中,該實(shí)例包含與日志消息的詳細(xì)信息相關(guān)的必要屬性。下面是LogMessage類——我只使用了兩個(gè)屬性來使它變得簡(jiǎn)單。
public class LogMessage { public string MessageText { get; set; } public DateTime MessageTime { get; set; } }
你應(yīng)該修改LogMessage類,以包含其他必要的屬性,例如,消息嚴(yán)重性等。下面的方法說明了如何將LogMessage類的實(shí)例存儲(chǔ)到消息隊(duì)列中。
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方法來存儲(chǔ)在消息隊(duì)列中創(chuàng)建的實(shí)例。
LogMessage msg = new LogMessage() { MessageText = "This is a test message.", MessageTime = DateTime.Now }; SendMessage(@".\Private$\IDGLog", msg);
下面的代碼清單演示了如何讀取存儲(chǔ)在消息隊(duì)列中的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的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C# 中類型轉(zhuǎn)換方式之顯式轉(zhuǎn)換和 as 運(yùn)算符
在 C# 中,有兩種常見的類型轉(zhuǎn)換方式:顯式轉(zhuǎn)換和as 運(yùn)算符,它們用于在不同類型之間進(jìn)行轉(zhuǎn)換,以下是對(duì)這兩種轉(zhuǎn)換方式的詳細(xì)解釋和示例說明,感興趣的朋友跟隨小編一起看看吧2024-05-05WPF自定義控件實(shí)現(xiàn)ItemsControl魚眼效果
這篇文章主要為大家詳細(xì)介紹了WPF如何通過自定義控件實(shí)現(xiàn)ItemsControl魚眼效果,文中的示例代碼講解詳細(xì),需要的可以參考一下2024-01-01C#實(shí)現(xiàn)判斷字符串中是否包含中文的方法
這篇文章主要介紹了C#實(shí)現(xiàn)判斷字符串中是否包含中文的方法,非常實(shí)用的功能,需要的朋友可以參考下2014-08-08C# 正則表達(dá)式常用的符號(hào)和模式解析(最新推薦)
這篇文章主要介紹了C# 正則表達(dá)式常用的符號(hào)和模式解析,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-12-12詳解C#中delegate/event/EventHandler/Action/Func的使用和區(qū)別
這篇文章主要為大家詳細(xì)介紹了C#中delegate、event、EventHandler、Action和Func的使用與區(qū)別,文中的示例代碼講解詳細(xì),感興趣的可以了解一下2023-04-04C# 利用Selenium實(shí)現(xiàn)瀏覽器自動(dòng)化操作的示例代碼
這篇文章主要介紹了C# 利用Selenium實(shí)現(xiàn)瀏覽器自動(dòng)化操作,幫助大家更好的理解和使用c#,感興趣的朋友可以了解下2020-09-09