分享程式代碼相關筆記
目前文章總數:157 篇
最後更新:2024年 12月 07日
本篇範例有3個專案
RabbitMQCommon:類庫,為RabbitMQ套件存放位置
RabbitMQReceive:消費者,負責接收資料
RabbitMQSend:生產者,負責傳送資料
在RabbitMQCommon專案中 -> Nuget -> 安裝RabbitMQ.Client
本篇使用6.3.0
RabbitMQ.Client 6.3.0
如圖,RabbitMQReceive,RabbitMQSend都要參考RabbitMQCommon專案
※RabbitMQ.Client 6.3.0套件安裝於RabbitMQCommon專案
程式執行介面如下,主要為一個發送按鈕與訊息紀錄
發送按鈕呼叫主要Method
/// <summary>
/// 執行傳送訊息按鈕
/// </summary>
private void ButtonSend_Click(object sender, EventArgs e)
{
SendRabbitMQWorking();
}
其中要注意 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}");
}
}
程式執行介面如下,主要為一個啟動按鈕與訊息紀錄
啟動接收按鈕觸發時才會將RabbitMQ Server上的Queue消費接收進來,然後存放到訊息紀錄中
/// <summary>
/// 啟動RabbitMQ接收端按鈕
/// </summary>
private void ButtonStarted_Click(object sender, EventArgs e)
{
statusLabel.Text = "連接中...";
RecevieRabbitMQ();
}
這邊要注意的是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);
}
開啟使用的RabbitMQ Serve,可以發現目前是沒有任何的資料進來
在RabbitMQSend專案,執行傳送訊息按鈕
※代碼中傳送都是發送現在時間,以便於驗證資料
並且RabbitMQ Server流量增加,畫面上出現資料
在RabbitMQSend專案,多次執行傳送訊息按鈕
並且開啟RabbitMQSend專案,畫面中是尚未執行
多次執行傳送,沒有消化的話,可以看到Ready數量為3
開啟RabbitMQRecive專案,並且執行後,可以取出剛剛傳送的3個資訊
並且觀察RabbitMQ Server上的資料,也已經消化掉取出
可以從Queues這個項目觀察,當前使用的Queue Name有哪些