C# 消息隊列


閱讀目錄

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

消息隊列是什么

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

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


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

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

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

  一、安裝MSMQ

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

  

  如果沒有看到該服務,點擊 控制面板-打開或關閉Windows功能,選中MSMQ項,再點擊“確定”按鈕即可啟用MSMQ服務,如下圖:

  

 

  二、支持類型

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

  三、示例代碼  

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();
        }
    }
}
View Code

 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();
        }
    }
}
View Code

 

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

 

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();
            }
        }
    }
}
View Code

 

 

 

兩個工程編程成功之后,先執行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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM