之前我在項目中要用到消息隊列相關的技術時,一直讓Redis兼職消息隊列功能,一個偶然的機會接觸到了MSMQ消息隊列。秉着技術還是專業的好為原則,對MSMQ進行了學習,以下是我個人的學習筆記。
一、什么是MSMQ
在我理解中,消息隊列就是一個數據的容器,並且可以異步處理數據,提高數據的並發性。比如投遞簡歷:用人單位就像是消息隊列,在同一時間,可以接受大量的簡歷(數據)。然后等回公司了再一份一份的取出查看。
二、MSMQ功能啟動(win 7為例)
好多系統默認是不開啟消息隊列(MSMQ)的。故,我們要手動開啟。具體流程為:打開控制面板-》程序和功能-》打開或關閉Windows功能(時間比較長)-》勾選Microsoft Message Queue(MSMQ)服務器;即可。如圖所示:
1、
2、
3、
完成以上操作,MSMQ便正常啟動了;
三、創建一個消息隊列(暫做了解,代碼也可以創建,感覺代碼更方便直觀)
我們通過打開計算機管理,就可以看到消息隊列的內容了。(計算機管理打開方式:控制面板-》管理工具-》計算機管理)如圖:
我們可以看出,系統給我們提供了四種隊列,但是我們用戶只能使用專用隊列這一項。隊列地址以private$\開頭。
我們可以嘗試創建一個專用隊列,"右擊"專用隊列,再點擊"新建",得到新增界面如下圖。
對話框里面有一個事務性,說明MSMQ是支持事物提交,由於目前沒有涉及到事物性,因此暫不講解。
我們起一個名為test的消息隊列點擊確定,我們便可以看到在右側出現了一個名為test的隊列。
四、怎么樣在.NET中使用MSMQ
對於.NET來說,微軟封裝了操作MSMQ的類,MessageQueue ;該類需要引入命名空間System.Messaging;
以下分模塊介紹MessageQueue 中的主要方法:
1、創建MSMQ隊列(Create)
string path =".\\private$\\"+ "test";//設置消息隊列路徑 if (!MessageQueue.Exists(path))//判斷該路徑是否存在 { MessageQueue.Create(path);//如果不存在則創建 } MessageBox.Show("ok");
2、發送數據(Send)
string path = ".\\private$\\" + "test";//設置消息隊列路徑 MessageQueue msqs = new MessageQueue(path);//創建指定路徑下的消息隊列對象 Message ms = new Message();//創建消息對象 ms .Formatter = new System.Messaging.XmlMessageFormatter(new Type[] { typeof(string) });//設置消息的Formatter數據類型 msqs.Send(ms); MessageBox.Show("成功");
注:在發送時,盡量使用消息隊列對象指定一個Formatter類型(用Formatter屬性)。在接收和發送均用相同類型。否則有可能程序在Receive時就拋異常。
3、接收數據(Receive)
string path = ".\\private$\\" + "test";//設置消息隊列路徑 MessageQueue msqs = new MessageQueue(path);//創建指定路徑下的消息隊列對象 System.Messaging.Message mes = msqs.Receive();//獲取單條數據(如果沒有數據,當前進程會被阻塞) string message = mes.Body.ToString();//獲取Message內的內容 MessageBox.Show(message);
注:Receive方法在沒有數據接收時,會阻塞線程。因此,建議放在單獨的線程中運行,以保證程序的穩定運行;
Message是MSMQ的一個數據容器,其中數據存儲在Body中。Body是一個已經被序列化的數據。故,在使用時要轉換為相應的類型。
以上是基礎的MSMQ的使用方式,掌握上述技術,可以使用MSMQ進行簡單的數據存儲。之后有更高級的用法我再補充。謝謝!