上一章我們講了隊列( Queue),這一章我們講Message Queue消息隊列,簡稱MQ。
定義:
MQ是MessageQueue,消息隊列的簡稱(是流行的開源消息隊列系統,利用erlang語言開發)。MQ是一種應用程序對應用程序的通信方法。
應用程序通過讀寫入隊和出隊的消息來通信,無需專用連接來鏈接它們。
消息傳遞是程序之間通過在消息中發送數據進行通信,而不是通過直接調用彼此來通信,一般應用於遠程過程調用的技術。
排隊指的是應用程序通過隊列來通信。應用隊列避免接收和發送數據的同時進行。
特點:
MQ是消費者-生產者模型的代表。一端往消息隊列中寫入消息,另一端可以讀取或者訂閱隊列中的消息。
MQ遵循的是AMQP協議(高級消息隊列協議:使得遵從該規范的客戶端應用和消息中間件服務器的全功能互操作成為可能)的具體實現和產品。
應用:
在使用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); } } } } } }
運行代碼,讀取隊列里面的內容,遵循先入先出原則。
這樣隊列的數據就讀取到了。
總結:
這是一個簡單的消息隊列的應用,寫的比較粗淺,具體需要結合實際應用項目編寫。
另外感謝大家的支持^_^
![]()
歡迎關注訂閱我的微信公眾平台【熊澤有話說】,更多好玩易學知識等你來取
作者:熊澤-學習中的苦與樂 公眾號:熊澤有話說 出處:https://www.cnblogs.com/xiongze520/p/10967874.html 創作不易,任何人或團體、機構全部轉載或者部分轉載、摘錄,請在文章明顯位置注明作者和原文鏈接。
|