日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > C# >内容正文

C#

C# 消息队列之MSMQ

發(fā)布時(shí)間:2023/12/4 C# 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C# 消息队列之MSMQ 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

首先說一下,消息隊(duì)列 (MSMQ Microsoft Message Queuing)是MS提供的服務(wù),也就是Windows操作系統(tǒng)的功能,并不是.Net提供的。

消息隊(duì)列(MSMQ)技術(shù)使得運(yùn)行于不同時(shí)間的應(yīng)用程序能夠在各種各樣的網(wǎng)絡(luò)和可能暫時(shí)脫機(jī)的系統(tǒng)之間進(jìn)行通信。

應(yīng)用程序?qū)⑾l(fā)送到隊(duì)列,并從隊(duì)列中讀取消息。

下圖演示了消息隊(duì)列如何保存由多個(gè)發(fā)送應(yīng)用程序生成的消息,并被多個(gè)接收應(yīng)用程序讀取。

消息一旦發(fā)送到隊(duì)列中,便會(huì)一直存在,即使發(fā)送的應(yīng)用程序已經(jīng)關(guān)閉。

?MSMQ服務(wù)默認(rèn)是關(guān)閉的,(Window7及以上操作系統(tǒng))按以下方式打開

1、打開運(yùn)行,輸入"OptionalFeatures",鉤上Microsoft Message Queue(MSMQ)服務(wù)器。

消息隊(duì)列(Message Queue)是一種使用隊(duì)列(Queue)作為底層存儲(chǔ)數(shù)據(jù)結(jié)構(gòu),可以用于解決不同進(jìn)程與應(yīng)用程序之間通訊的分布式消息容器,也可以稱為消息中間件。

目前比較常用的消息隊(duì)列有ActiveMQ、RabbitMQ、MSMQ ,Kafka、RocketMQ、Redis等。

消息隊(duì)列和隊(duì)列有什么區(qū)別呢?

唯一的區(qū)別在于入隊(duì)列的時(shí)候稱為生產(chǎn)者,出隊(duì)列的時(shí)候稱為消費(fèi)者。

我理解的MSMQ

????? MSMQ可以被看成一個(gè)數(shù)據(jù)儲(chǔ)存裝置,就如同數(shù)據(jù)庫,只不過數(shù)據(jù)存儲(chǔ)的是一條一條的記錄,而MSMQ存儲(chǔ)的是一個(gè)一個(gè)的消息(messsge)。Message可以被理解為一種數(shù)據(jù)容器,我們?cè)谏院髸?huì)講到。MSMQ一個(gè)重要的應(yīng)用場(chǎng)景就是離線信息交互,例如,我們?cè)诮o朋友發(fā)送郵件,而此時(shí)朋友并未登入郵箱,這個(gè)時(shí)候我們的郵件就可以發(fā)到郵件服務(wù)器的MSMQ隊(duì)列中,當(dāng)朋友登入郵箱的時(shí)候,系統(tǒng)在從服務(wù)器的MSMQ隊(duì)列中取出U件。當(dāng)然MSMQ的用途遠(yuǎn)不止這些,例如,充當(dāng)數(shù)據(jù)緩存,實(shí)現(xiàn)異步操作等等,這里就不在一一舉例了。

系統(tǒng)的消息隊(duì)列,為我們提供了3種隊(duì)列傳出隊(duì)列,專用隊(duì)列和系統(tǒng)隊(duì)列,而用戶能自由創(chuàng)建的只有專用隊(duì)列。我們可以嘗試創(chuàng)建一個(gè)專用隊(duì)列,"右擊"專用隊(duì)列,再點(diǎn)擊"新建",得到新增界面如下圖。由于我們創(chuàng)建的是專用隊(duì)列,所以在隊(duì)列命名上面顯示的添加"private$",另一個(gè)事務(wù)復(fù)選框表示我們要?jiǎng)?chuàng)建的是隊(duì)列是否為事務(wù)隊(duì)列,這個(gè)在稍后我會(huì)詳細(xì)的解釋

?

我在專用隊(duì)列里面添加一個(gè)叫"shaoshun"的專用隊(duì)列,在專用隊(duì)列文件夾下面就可以找到,如圖

消息

????? 消息是MSMQ的存儲(chǔ)對(duì)象,封裝為System.Messaging.Message對(duì)象,它由一個(gè)主體(body)和若干屬性構(gòu)成,其中我們的用戶數(shù)據(jù)通常被序列化裝入body主體中,這也是我們稱它為數(shù)據(jù)容器的原因。除了body屬性,還有幾個(gè)屬性相對(duì)來說比較重要:Priority(消息的優(yōu)先級(jí)),Label(用戶定義的消息標(biāo)識(shí)),Formatter(消息的序列組件,當(dāng)用戶將復(fù)雜類型數(shù)據(jù)填充到body中,用戶的數(shù)據(jù)會(huì)先被序列化)

隊(duì)列

  在前面,我們通過手動(dòng)創(chuàng)建了一個(gè)專用隊(duì)列。我們知道隊(duì)列分事務(wù)性隊(duì)列和非事務(wù)性隊(duì)列,默認(rèn)創(chuàng)建的是非事務(wù)性隊(duì)列。當(dāng)我們勾選事務(wù)性復(fù)選框,我們就會(huì)創(chuàng)建事務(wù)性隊(duì)列,那么什么是事務(wù)性隊(duì)列呢?事務(wù)性隊(duì)列將消息保存在磁盤上,實(shí)現(xiàn)了持久化,也就是說當(dāng)我們關(guān)機(jī),斷電后,下次再啟動(dòng)機(jī)器,我們的消息依然保存在隊(duì)列里面,而非事務(wù)性隊(duì)列則將消息保存在內(nèi)存中,也就是說我重啟電腦后,隊(duì)列里面的消息將不存在了。

?????隊(duì)列支持事務(wù)操作,當(dāng)我們把對(duì)多個(gè)消息的接收操作納入一個(gè)事務(wù)中,那么只要有一個(gè)消息接收不成功,隊(duì)列將拋棄前面接收的所有消息,實(shí)現(xiàn)事務(wù)回滾。隊(duì)列事務(wù)同時(shí)支持消息按順序接收與發(fā)送。

實(shí)例:

?需要先引用System.Messaging.dll

#region 消息隊(duì)列 using System; using System.Collections.Generic; using System.Linq; using System.Messaging; using System.Text; using System.Threading; using System.Threading.Tasks;namespace test {class Program{static void Main(string[] args){#region 創(chuàng)建消息隊(duì)列 const string queueName = @".\Private$\jiyiqin";MessageQueue mq = null;if (!MessageQueue.Exists(queueName))// 如果指定的路徑queueName中不存在隊(duì)列,那么在該路徑,即queueName中創(chuàng)建一個(gè)消息隊(duì)列。jiyiqin就是你想要?jiǎng)?chuàng)建消息隊(duì)列的名字{mq = MessageQueue.Create(queueName);//創(chuàng)建名稱jiyiqin的消息隊(duì)列的實(shí)例。Console.WriteLine("創(chuàng)建消息隊(duì)列完成:" + queueName);}else //如果消息隊(duì)列jiyiqin已經(jīng)存在,那么創(chuàng)建該消息隊(duì)列的一個(gè)實(shí)例{mq = new MessageQueue(queueName);//創(chuàng)建名稱jiyiqin的消息隊(duì)列的實(shí)例。}mq.SetPermissions("Administrator", MessageQueueAccessRights.FullControl);mq.SetPermissions("ANONYMOUS LOGON", MessageQueueAccessRights.FullControl);mq.SetPermissions("Everyone", MessageQueueAccessRights.FullControl);#endregion#region 發(fā)送消息隊(duì)列string strTx = "123我";Message msgTx = new Message();msgTx.Body = strTx;msgTx.Formatter = new XmlMessageFormatter(new Type[] { typeof(string) });mq.Send(msgTx);#endregion#region 接收消息隊(duì)列//接收到的消息對(duì)象Message msgRx = mq.Receive();//指定格式化程序msgRx.Formatter = new XmlMessageFormatter(new Type[] { typeof(string) });//接收到的內(nèi)容string strRx = msgRx.Body.ToString();System.Windows.Forms.MessageBox.Show(strRx);#endregion}} }

需加微信交流群的,請(qǐng)加小編微信號(hào)zls20210502,切記備注?加群,小編將會(huì)第一時(shí)間邀請(qǐng)你進(jìn)群!(目前①群已滿 ,需要在②群排隊(duì)等坑位)

總結(jié)

以上是生活随笔為你收集整理的C# 消息队列之MSMQ的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。