首頁

目前文章總數:157 篇

  

最後更新:2024年 12月 07日

0030. RabbitMQ生產者與消費者範例說明

日期:2022年 05月 22日

標籤: RabbitMQ C# Asp.NET Framework Windows Forms

摘要:C# 學習筆記


應用所需:1. RabbitMQ Server已安裝
     2. Visual Studio 2019以上(範例用.netCore)
解決問題:1. 如何使用程式進行RabbitMQ 傳送、接收訊息
範例檔案:連結※用Visual Studio 2022
基本介紹:本篇分為4大部分。
第一部分:代碼範例介紹
第二部分:Send傳送端代碼說明
第三部分:Receive接收端代碼說明
第四部分:Demo RabbitMQ傳送與接收






第一部分:代碼範例介紹

Step 1:代碼範例中的專案架構

本篇範例有3個專案
RabbitMQCommon:類庫,為RabbitMQ套件存放位置
RabbitMQReceive:消費者,負責接收資料
RabbitMQSend:生產者,負責傳送資料


Step 2:RabbitMQCommon專案安裝套件

在RabbitMQCommon專案中 -> Nuget -> 安裝RabbitMQ.Client
本篇使用6.3.0

RabbitMQ.Client 6.3.0




Step 3:Recive與Send專案增加參考專案

如圖,RabbitMQReceive,RabbitMQSend都要參考RabbitMQCommon專案
※RabbitMQ.Client 6.3.0套件安裝於RabbitMQCommon專案




第二部分:Send傳送端代碼說明

Step 1:Send執行介面

程式執行介面如下,主要為一個發送按鈕與訊息紀錄


Step 2:發送按鈕

發送按鈕呼叫主要Method


/// <summary>
/// 執行傳送訊息按鈕
/// </summary>
private void ButtonSend_Click(object sender, EventArgs e)
{
    SendRabbitMQWorking();
}



Step 3:Send Method內容

其中要注意 new ConnectionFactory() 中是連到指定的RabbitMQ Server的帳號、密碼、位址
範例中使用的Queue的Key是 “我是Queue的Key”


/// <summary>
/// 傳送主體(生產者)的Method
/// </summary>
public void SendRabbitMQWorking()
{
    //建立MQ連線基本資訊
    var factory = new ConnectionFactory()
    {
        HostName = "localhost",
        UserName = "guest",
        Password = "guest"
    };
    //傳送資訊(生產者)
    using (var connection = factory.CreateConnection())
    using (var channel = connection.CreateModel())
    {
        //Queue基本設置
        channel.QueueDeclare(queue: "我是Queue的Key",
                             durable: false,
                             exclusive: false,
                             autoDelete: false,
                             arguments: null);
        //傳送的內容
        string message = $@"現在時間{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.ffff")}";
        var body = Encoding.UTF8.GetBytes(message);
        channel.BasicPublish(exchange: "",
                             routingKey: "我是Queue的Key",
                             basicProperties: null,
                             body: body);
        sendTextBox.AppendText($@"[傳送] {message} {Environment.NewLine}");
    }
}





第三部分:Receive接收端代碼說明

Step 1:Recive執行介面

程式執行介面如下,主要為一個啟動按鈕與訊息紀錄


Step 2:啟動接收按鈕

啟動接收按鈕觸發時才會將RabbitMQ Server上的Queue消費接收進來,然後存放到訊息紀錄中

/// <summary>
/// 啟動RabbitMQ接收端按鈕
/// </summary>
private void ButtonStarted_Click(object sender, EventArgs e)
{
    statusLabel.Text = "連接中...";
    RecevieRabbitMQ();
}



Step 3:Recive Method內容

這邊要注意的是RabbitMQServer只會承認最後一個執行的消費者(如果參數Key相同的話)
範例中使用的Queue Key是 “我是Queue的Key”

/// <summary>
/// 接收端主體Method
/// </summary>
private void RecevieRabbitMQ()
{
    //建立MQ連線基本資訊
    var factory = new ConnectionFactory()
    {
        HostName = "localhost",
        UserName = "guest",
        Password = "guest"
    };
    //開啟連線
    var connection = factory.CreateConnection();
    var channel = connection.CreateModel();
    //Queue基本設置
    channel.QueueDeclare(queue: "我是Queue的Key",
                         durable: false,
                         exclusive: false,
                         autoDelete: false,
                         arguments: null);
    var consumer = new EventingBasicConsumer(channel);
    //設定RabbitMQ 消費者(Consumer)的工作
    consumer.Received += (model, ea) =>
    {
        var body = ea.Body.ToArray();
        var message = Encoding.UTF8.GetString(body);
        ThreadStart threadParameters = new ThreadStart(delegate { WriteTextBox($@"[接收] {message}"); });
        RabbitMQThread = new Thread(threadParameters);
        RabbitMQThread.Start();
    };
    channel.BasicConsume(queue: "我是Queue的Key",
                         autoAck: true,
                         consumer: consumer);
}





第四部分:Demo RabbitMQ傳送與接收

Step 1:檢視RabbitMQ Server

開啟使用的RabbitMQ Serve,可以發現目前是沒有任何的資料進來


Step 2:傳送端發送

在RabbitMQSend專案,執行傳送訊息按鈕
※代碼中傳送都是發送現在時間,以便於驗證資料
並且RabbitMQ Server流量增加,畫面上出現資料



Step 3:傳送端發送-2

在RabbitMQSend專案,多次執行傳送訊息按鈕
並且開啟RabbitMQSend專案,畫面中是尚未執行


Step 4:傳送端發送-3

多次執行傳送,沒有消化的話,可以看到Ready數量為3


Step 5:執行接收-完成RabbitMQ

開啟RabbitMQRecive專案,並且執行後,可以取出剛剛傳送的3個資訊
並且觀察RabbitMQ Server上的資料,也已經消化掉取出



Step 6:檢視Queues使用列表

可以從Queues這個項目觀察,當前使用的Queue Name有哪些