//p/.html
1. 定義
MQ是消息隊列的縮寫(是一種流行的開源消息隊列系統,由語言開發)。
MQ 是一種應用程序到應用程序的通信方法。
應用程序通過在隊列中讀取和寫入消息來進行通信,無需專用連接來鏈接它們。
消息傳遞是程序通過在消息中發送數據而不是直接相互調用來進行通信的技術,一般應用于遠程過程調用。
隊列是指應用程序通過隊列進行通信。 應用程序隊列避免同時接收和發送數據。
2. 特點
MQ是消費者-生產者模型的代表。 一端將消息寫入消息隊列,另一端可以讀取或訂閱隊列中的消息。
MQ 遵循 AMQP 協議(??高級消息隊列協議:使得符合此規范的客戶端應用程序和消息中間件服務器之間的全功能互操作成為可能)的具體實現和產品。
3. 申請
使用MQ時,我們不需要實時返回信息。 獲取信息并返回信息以進行異步處理。
例如:在項目中,我們需要使用CAN總線從汽車系統獲取汽車的實時信息,但不需要向汽車返回信息。
比如獲取汽車的輪胎氣壓,但是我們不需要給汽車返回信息或者結果。
如果要使用C#工程來獲取實時數據,需要先安裝客戶端的庫文件:..dll,下面會提到。
備用下載路徑:
關聯:
提取碼:6962
寫在前面:這個需要安裝服務,下載環境并安裝,引入..dll動態庫。 以下官方網站可以下載相應的內容。
我用的是64位的。 我這里把安裝程序整理在百度網盤上。 官網打開很慢,去百度網盤下載。
關聯:
提取碼:6962
4. 安裝
需要安裝服務:
官網下載地址: 。
下載完成后,繼續點擊下一步。
如果沒有環境,會彈出如下提示:
下載環境并安裝,安裝時直接點擊下一步即可
地址:
如果網頁打開慢或者打不開,我可以下載下來整理一下,不過我的是64位的。
關聯:
提取碼:6962
安裝完成后,我們需要配置環境變量,如下:
右鍵【計算機】,屬性,高級系統設置,高級,環境變量,
創建一個新的系統變量。
進入
變量名稱:,
變量值:C:\Files\erl9.3
變量值為你剛剛安裝的路徑
然后在環境變量中找到Path,點擊編輯,添加;%%\bin; 變量值的末尾,記得有一個分號(英文分號)
安裝成功后,你會在服務中看到該服務。
然后安裝,一直點擊下一步,
到這里,準備工作就完成了,接下來我們就寫代碼了。
有些童鞋不知道為什么需要安裝服務和環境。 我在這里簡單科普一下,詳細請百度。
它是一個實現高級消息隊列協議(AMQP)的開源消息代理軟件(也稱為面向消息的中間件)。
服務器是用該語言編寫的,而集群和故障轉移是在開放電信平臺框架上構建的。
所有主要編程語言都有用于與代理接口通信的客戶端庫。
5. 代碼示例
為了更好地解釋,我們創建兩個新的控制臺應用程序(生產者)和(消費者),
先別急著搭建,看下面的代碼依次搭建。
制片人
新建一個控制臺應用程序,引用動態文件庫..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);
}
}
}
}
}
}
控制臺入隊操作,控制臺步驟可以結合實際代碼需求入隊。
到這里我們已經成功入隊了,接下來我們就要出隊了,也就是讀取數據,有點像這樣,這里使用的是我們之前安裝的服務。
制片人
新建一個控制臺應用程序,引用動態文件庫..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);
}
}
}
}
}
}
運行代碼,讀取隊列內容,遵循先進先出原則。
這樣就讀取了隊列的數據。
六、總結
這是一個簡單的消息隊列應用,寫得比較淺,需要結合實際應用項目來編寫。