C# Queue與RabbitMQ的愛恨情仇(文末附源碼):Q與MQ消息隊列簡單應用(二)

上一章咱們講了隊列( Queue),這一章咱們講Message Queue消息隊列,簡稱MQ。html

定義:編程

  MQ是MessageQueue,消息隊列的簡稱(是流行的開源消息隊列系統,利用erlang語言開發)。MQ是一種應用程序對應用程序的通訊方法。windows

應用程序經過讀寫入隊和出隊的消息來通訊,無需專用鏈接來連接它們。服務器

消息傳遞是程序之間經過在消息中發送數據進行通訊,而不是經過直接調用彼此來通訊,通常應用於遠程過程調用的技術。框架

 排隊指的是應用程序經過隊列來通訊。應用隊列避免接收和發送數據的同時進行。異步

特色:編程語言

  MQ是消費者-生產者模型的表明。一端往消息隊列中寫入消息,另外一端能夠讀取或者訂閱隊列中的消息。函數

MQ遵循的是AMQP協議(高級消息隊列協議:使得聽從該規範的客戶端應用和消息中間件服務器的全功能互操做成爲可能)的具體實現和產品。spa

應用:3d

  在使用MQ時,咱們不須要實時的返回信息。獲取信息和返回信息進行異步處理。

例如:在項目中,咱們須要從汽車系統中利用CAN總線實時的獲取汽車的相關信息,可是沒有必要給汽車返回信息。

如,獲取汽車的輪胎氣壓,可是咱們不須要給汽車一個返回的信息或結果。

    C#項目要利用RabbitMQ來獲取實時數據的話,須要先安裝客戶端的庫文件:RabbitMQ.Client.dll,下面有提到。

備用下載路徑:

連接:https://pan.baidu.com/s/1zcQmPnBF7WcD8sqV4W54pw 
提取碼:6962 


寫在前面:

這個就須要安裝RabbitMQ服務、下載Erlang環境並安裝、引入RabbitMQ.client.dll動態庫。下面有官網能夠下載相應的內容。

我這個使用windows 64位的,我這裏整理安裝程序在百度網盤,官網打開Erlang很慢的去我百度網盤下載

連接:https://pan.baidu.com/s/1zcQmPnBF7WcD8sqV4W54pw
提取碼:6962 


 

安裝

須要安裝RabbitMQ服務:

官網下載地址:http://www.rabbitmq.com/download.html

下載完成後一直點擊下一步便可。

若是沒有Erlang環境會彈出下面的提示:

 

下載Erlang環境並安裝,安裝時一直點下一步便可

地址:http://www.erlang.org/downloads

若是打開網頁慢或者打不開的,去下載我整理也行,不過個人是windows 64的。

連接:https://pan.baidu.com/s/1zcQmPnBF7WcD8sqV4W54pw 
提取碼:6962 

安裝完成後咱們須要配置環境變量,以下:

點擊【計算機】右鍵,屬性,高級系統設置,高級,環境變量,

新建一個系統變量。

輸入

變量名:ERLANG_HOME,

變量值:C:\Program Files\erl9.3

變量值是你剛剛安裝Erlang的路徑

 

 而後在找到環境變量裏面的Path,點擊編輯,在變量值的最後面加上  ;%ERLANG_HOME%\bin;,記得有分號(英文分號)

 

 

安裝成功後會在服務中看到該服務。.

 

而後安裝RabbitMQ,也是一直點擊下一步便可, 

到這裏後就準備工做作完了,接下來咱們就編寫代碼。

有的童鞋不知道爲何須要安裝RabbitMQ服務和Erlang環境,我這裏簡單普及一下,詳細的請百度一下。

RabbitMQ是實現了高級消息隊列協議(AMQP)的開源消息代理軟件(亦稱面向消息的中間件)。

RabbitMQ服務器是用Erlang語言編寫的,而集羣和故障轉移是構建在開放電信平臺框架上的。

全部主要的編程語言均有與代理接口通信的客戶端庫。

.


 代碼實例:

爲了講解效果更佳,咱們新建兩個控制檯應用程序MessageQueueClient(生產者)和MessageQueueServer(消費者),

不要急着創建,看下面的代碼依次創建。

生產者 :

新建控制檯應用程序MessageQueueClient,引用動態文件庫RabbitMQ.Client.dll,能夠去百度下載一個,上面的網盤路徑裏面有。

入隊代碼編寫:

using RabbitMQ.Client;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace MessageQueueClient
{
    class Program
    {
        static void Main(string[] args)
        {
            //生產者
            ConnectionFactory factory = new ConnectionFactory();
            factory.HostName = "127.0.0.1";
            //默認端口
            factory.Port = 5672;
            using (IConnection conn = factory.CreateConnection())
            {
                using (IModel channel = conn.CreateModel())
                {
                    //在MQ上定義一個持久化隊列,若是名稱相同不會重複建立
                    channel.QueueDeclare("MyRabbitMQ", true, false, false, null);
                    while (true)
                    {
                        string message = string.Format("{0}", Console.ReadLine());  //Console.ReadLine()爲控制檯輸入的內容,咱們能夠用其餘方式獲取
                        byte[] buffer = Encoding.UTF8.GetBytes(message);
                        IBasicProperties properties = channel.CreateBasicProperties();  
                        properties.DeliveryMode = 2;
                        channel.BasicPublish("", "MyRabbitMQ", properties, buffer);  //入隊
                        Console.WriteLine("入隊成功:" + message);
                    }
                }
            }
        }
    }
}

控制檯入隊操做,控制檯這一步能夠結合實際代碼需求進行入隊。

這裏就入隊成功了,接下來咱們出隊,也就是讀取數據,這裏和readis有點像,咱們以前安裝的RabbitMQ服務就是在這裏用到了。

 

生產者 :

新建控制檯應用程序MessageQueueServer,引用動態文件庫RabbitMQ.Client.dll,能夠去百度下載一個,上面的網盤路徑裏面有。

出隊代碼編寫:

using RabbitMQ.Client;
using RabbitMQ.Client.Events;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace MessageQueueServer
{
    class Program
    {
        static void Main(string[] args)
        {
            //消費者
            ConnectionFactory factory = new ConnectionFactory();
            factory.HostName = "127.0.0.1";
            //默認端口
            factory.Port = 5672;
            using (IConnection conn = factory.CreateConnection())
            {
                using (IModel channel = conn.CreateModel())
                {
                    //在MQ上定義一個持久化隊列,若是名稱相同不會重複建立
                    channel.QueueDeclare("MyRabbitMQ", true, false, false, null);

                    //輸入1,那若是接收一個消息,可是沒有應答,則客戶端不會收到下一個消息
                    channel.BasicQos(0, 1, false);

                    Console.WriteLine("Listening...");

                    //在隊列上定義一個消費者
                    QueueingBasicConsumer consumer = new QueueingBasicConsumer(channel);
                    //消費隊列,並設置應答模式爲程序主動應答
                    channel.BasicConsume("MyRabbitMQ", false, consumer);

                    while (true)
                    {
                        //阻塞函數,獲取隊列中的消息
                        BasicDeliverEventArgs ea = (BasicDeliverEventArgs)consumer.Queue.Dequeue();
                        byte[] bytes = ea.Body;
                        string str = Encoding.UTF8.GetString(bytes);

                        Console.WriteLine("讀取隊列消息:" + str.ToString());
                        //回覆確認
                        channel.BasicAck(ea.DeliveryTag, false);
                    }
                }
            }
        }
    }
}

運行代碼,讀取隊列裏面的內容,遵循先入先出原則。

這樣隊列的數據就讀取到了。

 

總結:

這是一個簡單的消息隊列的應用,寫的比較粗淺,具體須要結合實際應用項目編寫。

另外感謝你們的支持^_^

相關文章
相關標籤/搜索