C# 消息隊列

閱讀目錄html

1. 消息隊列是什麼?
2. 常見的消息隊列框架有哪些?
3. MSMQ介紹
4. RabbitMQ介紹 
編程

消息隊列是什麼安全

  簡單的理解就是將消息添加一個隊列中,使用時在從這個隊列中取出來。那麼消息什麼?隊列又是什麼呢?

  消息:說白了就是交互的內容,能夠是文字、圖片、視頻等等。
  隊列:一種先進先出的存儲格式。 網絡


  消息隊列提供保證消息傳遞,高效的路由、安全和基於優先級的消息。它能夠用來實現須要高性能的異步和同步場景的解決方案。

常見的消息隊列框架有哪些?
  業內有不少種消息隊列框架和中間件,目前使用過的只有RabbitMQ和微軟的MSMQ,接下來重點介紹這兩種。
框架

MSMQ介紹
  Window系統下自帶了微軟自家的消息隊列框架——MSMQ,是在多個不一樣的應用之間實現相互通訊的一種異步傳輸模式,相互通訊的應用能夠分佈於同一臺機器上,也能夠分佈於相連的網絡空間中的任一位置。它的實現原理是:消息的發送者把本身想要發送的信息放入一個容器中(咱們稱之爲Message),而後把它保存至一個系統公用空間的消息隊列(Message Queue)中;本地或者是異地的消息接收程序再從該隊列中取出發給它的消息進行處理。
異步

  1、安裝MSMQ編程語言

  首先,看看是否已經啓用MSMQ服務,打開服務窗體,若是能如找到MSMQ服務,說明已經啓用,以下圖:ide

  

  若是沒有看到該服務,點擊 控制面板-打開或關閉Windows功能,選中MSMQ項,再點擊「肯定」按鈕便可啓用MSMQ服務,以下圖:post

  

 

  2、支持類型性能

  MSMQ 支持兩種類型的消息: XML 和二進制。 

  3、示例代碼  

複製代碼
using System; using System.Messaging; namespace QiDaShengDemo { class Program { static void Main(string[] args) { MessageQueue messageQueue = null; //判斷指定的路徑是否存在「消息隊列」隊列,若是存在直接初始化,並設置好說明 //不然在指定的路徑中建立「消息隊列」 if (MessageQueue.Exists(@".\Private$\MyQueues")) { messageQueue = new MessageQueue(@".\Private$\MyQueues"); messageQueue.Label = "Testing Queue"; } else { messageQueue = MessageQueue.Create(@".\Private$\MyQueues"); messageQueue.Label = "New Create Queue"; } //發送對象到消息隊列中,並設置好標籤 messageQueue.Send("First ever Message is sent to MSMQ", "Title"); //設置消息類型 messageQueue.Formatter = new XmlMessageFormatter(new string[] { "System.String" }); foreach (Message msg in messageQueue) { string readMessage = msg.Body.ToString(); Console.WriteLine(readMessage); } messageQueue.Purge(); Console.Read(); } } }
複製代碼

 RabbitMQ介紹

       RabbitMQ是一個很是流行的消息隊列框架,使用簡單,可以使用於當前全部主要的操做系統,而且是開源的,目前最新的版本爲3.6.5。

 RabbitMQ安裝

       卸載歷史版本

       若是本地以前已經安裝過Erlang(一種編程語言)虛擬機,,要先卸載。

 

       安裝RabbitMQ Server

       首先,要先下載 Erlang Windows Binary File,下載以後安裝便可。

       而後,在下載rabbitmq-server-3.6.5.exe,下載以後點擊安裝便可,這樣RabbitMQ Server就安裝成功了,安裝成功以後在「開始」菜單能夠看到以下信息:

 

 

如上圖所示,咱們能夠從新安裝、移除、開始、中止 RabbitMQ 服務。

 

RabbitMQ示例

簡單的進程通信,一個Producer發送一條message到消息隊列中,一個Consumer從消息隊列中接收到這條message。

 

 

新建一個控制檯程序,發送端示例代碼:

複製代碼
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using RabbitMQ.Client; namespace RabbitMQ.Send { class Program { static void Main(string[] args) { var factory = new ConnectionFactory() { HostName="localhost"}; using (var connection = factory.CreateConnection()) using (var channel=connection.CreateModel()) { channel.QueueDeclare(queue: "hello", durable: false, exclusive:false, autoDelete:false, arguments:null ); string message = "Hello world qds!"; var body = Encoding.UTF8.GetBytes(message); channel.BasicPublish(exchange:"", routingKey:"hello", basicProperties:null, body:body ); Console.WriteLine(" [x]send {0}",message); } Console.WriteLine(" Press [enter] to exit."); Console.ReadLine(); } } }
複製代碼

 

新建一個控制檯程序,接收端示例代碼:

 

複製代碼
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using RabbitMQ.Client; using RabbitMQ.Client.Events; namespace RabbitMQ.Receive { class Program { static void Main(string[] args) { var factory = new ConnectionFactory() { HostName="localhost"}; using (var connection = factory.CreateConnection()) using (var channel=connection.CreateModel()) { channel.QueueDeclare(queue:"hello", durable:false, exclusive:false, autoDelete:false, arguments:null ); var consumer = new EventingBasicConsumer(channel); consumer.Received += (model,ea) => { var body = ea.Body; var message = Encoding.UTF8.GetString(body); Console.WriteLine(" [x] Received {0}", message); }; channel.BasicConsume(queue: "hello", noAck: true, consumer:consumer ); Console.WriteLine(" Press [enter] to exit."); Console.ReadLine(); } } } }
複製代碼

 

 

 

兩個工程編程成功以後,先執行RabbitMQ.Send.exe,再執行RabbitMQ.Receive.exe,

結果以下:

 

 

 

 

想了解更多,可參考RabbiMQ官網:http://www.rabbitmq.com/

參考:

[1].http://www.cnblogs.com/tenghoo/archive/2009/11/05/1596456.html

[2].http://www.cnblogs.com/danielWise/archive/2011/02/28/1966808.html

[3].http://www.cnblogs.com/gossip/p/4373547.html

[4].http://www.cnblogs.com/shanyou/archive/2012/10/27/2742979.html

相關文章
相關標籤/搜索