前段時間研究WCF接觸到了MSMQ,因此認真的學習了一下,下面是個人筆記。html
MSMQ能夠被當作一個數據儲存裝置,就如同數據庫,只不過數據存儲的是一條一條的記錄,而MSMQ存儲的是一個一個的消息(messsge)。Message能夠被理解爲一種數據容器,咱們在稍後會講到。MSMQ一個重要的應用場景就是離線信息交互,例如,咱們在給朋友發送郵件,而此時朋友並未登入郵箱,這個時候咱們的郵件就能夠發到郵件服務器的MSMQ隊列中,當朋友登入郵箱的時候,系統在從服務器的MSMQ隊列中取出U件。固然MSMQ的用途遠不止這些,例如,充當數據緩存,實現異步操做等等,這裏就不在一一舉例了。數據庫
咱們在使用MSMQ的時候須要安裝MSMQ,具體步驟請點擊 這裏。當咱們正確的安裝了MSMQ咱們能夠在"計算機管理(本地)"找到安裝的MSMQ服務,以下圖緩存
在圖上咱們能夠看見系統的消息隊列,爲咱們提供了3種隊列傳出隊列,專用隊列和系統隊列,而用戶能自由建立的只有專用隊列。咱們能夠嘗試建立一個專用隊列,"右擊"專用隊列,再點擊"新建",獲得新增界面以下圖。因爲咱們建立的是專用隊列,因此在隊列命名上面顯示的添加"private$",另外一個事務複選框表示咱們要建立的是隊列是否爲事務隊列,這個在稍後我會詳細的解釋服務器
我在專用隊列裏面添加一個叫"shaoshun"的專用隊列,在專用隊列文件夾下面就能夠找到,如圖異步
消息是MSMQ的存儲對象,封裝爲System.Messaging.Message對象,它由一個主體(body)和若干屬性構成,其中咱們的用戶數據一般被序列化裝入body主體中,這也是咱們稱它爲數據容器的緣由。除了body屬性,還有幾個屬性相對來講比較重要:Priority(消息的優先級),Label(用戶定義的消息標識),Formatter(消息的序列組件,當用戶將複雜類型數據填充到body中,用戶的數據會先被序列化)學習
在前面,咱們經過手動建立了一個專用隊列。咱們知道隊列分事務性隊列和非事務性隊列,默認建立的是非事務性隊列。當咱們勾選事務性複選框,咱們就會建立事務性隊列,那麼什麼是事務性隊列呢?事務性隊列將消息保存在磁盤上,實現了持久化,也就是說當咱們關機,斷電後,下次再啓動機器,咱們的消息依然保存在隊列裏面,而非事務性隊列則將消息保存在內存中,也就是說我重啓電腦後,隊列裏面的消息將不存在了。.net
隊列支持事務操做,當咱們把對多個消息的接收操做歸入一個事務中,那麼只要有一個消息接收不成功,隊列將拋棄前面接收的全部消息,實現事務回滾。隊列事務同時支持消息按順序接收與發送。orm
本文我對MSMQ的相關概念進行了說明,在下一篇,我將經過代碼來介紹MSMQ在.net中的常規操做htm