目錄
RabbitMQ --- Work Queues(工作隊列)
RabbitMQ --- Publish/Subscribe(發布/訂閱)
RabbitMQ --- Routing(路由)
安裝環境
1.下載安裝 Erlang 運行時環境
2.下載安裝 RabbitMQ Server 應用程序
3.啟動 RabbitMQ 服務(默認啟動)
4.安裝管理平台插件並打開遠程訪問權限
4.1.打開 RabbitMQ Comman Prompt
4.2.執行 rabbitmq-plugins enable rabbitmq_management
4.3.訪問 http://localhost:15672 查看 RabbitMQ Server 相關信息(默認賬密為guest)
4.4.新增遠程訪問用戶
4.5.點擊 Set permission 授權給新用戶
4.6.停止 RabbitMQ 服務
4.7.修改 ...\rabbitmq_server-3.6.10\etc\rabbitmq.config.example 文件(新增第18行代碼)
4.8.啟動 RabbitMQ 服務
4.9.訪問 http://IP:15672 測試是否成功
基本概念
單個消息生產者 VS 單個消息消費者
在 .NET 中使用 RabbitMQ 需要下載它的客戶端程序集來獲取並引用 RabbitMQ 相關的組件。
using RabbitMQ.Client; using System; using System.Text; //消息生產者控制台 namespace Producer { class Program { static void Main(string[] args) { //創建連接工廠對象 var factory = new ConnectionFactory { HostName = "10.202.228.107",//目標主機IP或名稱 UserName = "Tua",//RabbitMQ服務的用戶名稱 Password = "Tua",//RabbitMQ服務的密碼 Port = 5672//RabbitMQ服務的默認端口號是5672,可以不用顯示指定端口 }; //創建連接對象 using (var connection = factory.CreateConnection()) { //創建消息信道對象 using (var channel = connection.CreateModel()) { //創建消息隊列,只有在該消息隊列不存在時才會創建 channel.QueueDeclare ( queue: "Tua",//消息隊列名稱 durable: false,//是否開啟持久,true:即不會因為RabbitMQ服務崩潰重啟而丟失消息隊列 exclusive: false,//是否開啟反外,true:即只允許在當前連接中被訪問,當連接斷開時會自動清除該消息隊列 autoDelete: false,//是否開啟自動刪除,true:即當無任何消息消費者時,也就是說最后一個連接斷開時會自動清除該消息隊列 arguments: null//用於消息隊列的其它屬性(構造參數) ); string msg = "Mr.Tua"; var body = Encoding.UTF8.GetBytes(msg);//將字符串消息轉換成二進制數組 //發送消息,將消息發布到消息隊列中 channel.BasicPublish ( exchange: string.Empty,//消息交換機名稱 routingKey: "Tua",//路由鍵名稱,指定發送到"Tua"隊列 basicProperties: null,//消息的其它屬性 body: body//消息內容 ); Console.WriteLine("Producer sent message: {0}", msg); Console.ReadLine(); } } } } }
using RabbitMQ.Client; using RabbitMQ.Client.Events; using System; using System.Text; //消息消費者控制台 namespace Consumer { 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: "Tua", durable: false, exclusive: false, autoDelete: false, arguments: null ); //創建消息消費者對象 var consumer = new EventingBasicConsumer(channel); //異步接收消息時的回調 consumer.Received += (sender, e) => { var body = e.Body; var msg = Encoding.UTF8.GetString(body); Console.WriteLine("Consumer received message: {0}", msg); }; //啟動消息消費者 //消息消費者處理完消息任務時需要回應消息生產者,使其刪除該消息 //如果消息消費者沒有回應,那么消息生產者會將該消息重新發送給其它消息消費者 channel.BasicConsume ( queue: "Tua", noAck: true,//是否自動回應,false:即需要手動進行消息回應 consumer: consumer ); Console.ReadLine(); } } } } }
運行結果
啟動消息生產者控制台:
啟動消息消費者控制台:
在 RabbitMQ Comman Prompt 中執行 rabbitmqctl list_queues 查看消息隊列:
Producer 在 RabbitMQ Server 中創建了一個名為 Tua 的消息隊列並含有一條 Mr.Tua 的消息,Consumer 接收到了該消息, 而 Producer 得到了回應就會立即刪除該消息。