.NET Core實現(xiàn)RabbitMQ消息隊列的示例代碼
RabbitMQ 是一個流行的消息隊列中間件,它允許應(yīng)用程序通過異步消息的方式進(jìn)行通信。RabbitMQ 支持 AMQP 協(xié)議,可以通過多種方式與應(yīng)用程序交互。在本教程中,我們將深入探討如何在 .NET Core 環(huán)境中使用 RabbitMQ 來實現(xiàn)消息隊列。我們將學(xué)習(xí)如何在生產(chǎn)者端發(fā)送消息,消費者端接收消息,并確保消息的可靠性。
1. 安裝和配置 RabbitMQ
在開始使用 RabbitMQ 之前,首先需要確保你的機(jī)器上已經(jīng)安裝并運行 RabbitMQ??梢酝ㄟ^以下方式安裝 RabbitMQ:
使用 Docker 安裝 RabbitMQ
RabbitMQ 提供了官方的 Docker 鏡像,這使得在本地機(jī)器上運行 RabbitMQ 非常簡單。
docker pull rabbitmq:management docker run -d -p 5672:5672 -p 15672:15672 rabbitmq:management
5672
是 RabbitMQ 的默認(rèn)消息隊列端口。15672
是 RabbitMQ 管理插件的 Web 界面端口。通過瀏覽器訪問http://localhost:15672
可以登錄 RabbitMQ 管理界面,默認(rèn)的用戶名和密碼都是guest
。
安裝并啟動 RabbitMQ 后,您可以繼續(xù)進(jìn)行開發(fā)。
2. 安裝 RabbitMQ 客戶端庫
在 .NET Core 中與 RabbitMQ 進(jìn)行交互,我們需要使用 RabbitMQ.Client
NuGet 包??梢酝ㄟ^以下命令在項目中添加這個依賴:
dotnet add package RabbitMQ.Client
這個庫提供了與 RabbitMQ 服務(wù)進(jìn)行交互所需的所有工具。
3. 創(chuàng)建生產(chǎn)者(Producer)
生產(chǎn)者是負(fù)責(zé)將消息發(fā)送到 RabbitMQ 的應(yīng)用程序。它通過連接到 RabbitMQ 服務(wù)器、創(chuàng)建一個隊列和交換機(jī),將消息發(fā)布到隊列中。
創(chuàng)建消息生產(chǎn)者代碼
下面是一個基本的生產(chǎn)者示例代碼,展示了如何連接到 RabbitMQ,聲明隊列,并發(fā)送一條簡單的消息:
using RabbitMQ.Client; using System; using System.Text; class Program { static void Main(string[] args) { // 創(chuàng)建連接工廠 var factory = new ConnectionFactory() { HostName = "localhost" }; // 創(chuàng)建連接和通道 using (var connection = factory.CreateConnection()) using (var channel = connection.CreateModel()) { // 聲明一個隊列(確保隊列存在) channel.QueueDeclare(queue: "hello_queue", durable: false, exclusive: false, autoDelete: false, arguments: null); // 創(chuàng)建消息 string message = "Hello, RabbitMQ!"; var body = Encoding.UTF8.GetBytes(message); // 發(fā)送消息到隊列 channel.BasicPublish(exchange: "", routingKey: "hello_queue", basicProperties: null, body: body); Console.WriteLine(" [x] Sent {0}", message); } Console.WriteLine(" Press [enter] to exit."); Console.ReadLine(); } }
在上面的代碼中:
ConnectionFactory
用來創(chuàng)建連接到 RabbitMQ 服務(wù)器的連接。QueueDeclare
用來聲明一個隊列,確保隊列存在。如果隊列已經(jīng)存在,聲明將被忽略。BasicPublish
用來將消息發(fā)送到隊列。
參數(shù)說明:
queue
: 隊列的名稱(此例中是hello_queue
)。durable
: 是否將隊列標(biāo)記為持久化。如果設(shè)置為true
,即使 RabbitMQ 重啟,隊列也會存在。exclusive
: 是否使隊列只對當(dāng)前連接可用。autoDelete
: 是否在最后一個消費者斷開連接時自動刪除隊列。
4. 創(chuàng)建消費者(Consumer)
消費者從隊列中獲取并處理消息。消費者通常是另一個應(yīng)用程序,它會連接到 RabbitMQ,并持續(xù)地從隊列中取出消息進(jìn)行處理。
創(chuàng)建消息消費者代碼
using RabbitMQ.Client; using RabbitMQ.Client.Events; using System; using System.Text; class Program { static void Main(string[] args) { // 創(chuàng)建連接工廠 var factory = new ConnectionFactory() { HostName = "localhost" }; // 創(chuàng)建連接和通道 using (var connection = factory.CreateConnection()) using (var channel = connection.CreateModel()) { // 聲明隊列,確保消費者能夠連接到相同的隊列 channel.QueueDeclare(queue: "hello_queue", durable: false, exclusive: false, autoDelete: false, arguments: null); // 創(chuàng)建消費者對象 var consumer = new EventingBasicConsumer(channel); // 消息處理邏輯 consumer.Received += (model, ea) => { var body = ea.Body.ToArray(); var message = Encoding.UTF8.GetString(body); Console.WriteLine(" [x] Received {0}", message); }; // 開始消費消息 channel.BasicConsume(queue: "hello_queue", autoAck: true, consumer: consumer); Console.WriteLine(" Press [enter] to exit."); Console.ReadLine(); } } }
在上面的代碼中:
QueueDeclare
用來確保消費者連接到相同的隊列。EventingBasicConsumer
是消費者的實現(xiàn),用于異步接收消息。BasicConsume
用于開始消費消息,autoAck
設(shè)置為true
,表示自動確認(rèn)消息。
參數(shù)說明:
autoAck
: 如果設(shè)置為true
,消費者會自動確認(rèn)消息。如果設(shè)置為false
,需要手動確認(rèn)消息。
5. 持久化消息
如果您希望在 RabbitMQ 重啟后保持消息的持久性,可以在生產(chǎn)者和消費者中啟用消息的持久化。
消息持久化設(shè)置
在生產(chǎn)者端發(fā)送持久化消息:
// 設(shè)置消息持久化 var properties = channel.CreateBasicProperties(); properties.Persistent = true; // 設(shè)置消息為持久化 channel.BasicPublish(exchange: "", routingKey: "hello_queue", basicProperties: properties, body: body);
此外,聲明隊列時也需要設(shè)置 durable: true
,確保隊列本身是持久化的。
channel.QueueDeclare(queue: "hello_queue", durable: true, exclusive: false, autoDelete: false, arguments: null);
6. 消息確認(rèn)機(jī)制
在消息傳遞過程中,為了確保消息被成功消費并避免丟失,可以啟用消息確認(rèn)機(jī)制。在這種情況下,消費者需要顯式確認(rèn)消息。
啟用手動消息確認(rèn)
在消費者端禁用自動確認(rèn),并手動確認(rèn)每條已成功處理的消息:
channel.BasicConsume(queue: "hello_queue", autoAck: false, consumer: consumer); consumer.Received += (model, ea) => { var body = ea.Body.ToArray(); var message = Encoding.UTF8.GetString(body); Console.WriteLine(" [x] Received {0}", message); // 手動確認(rèn)消息 channel.BasicAck(deliveryTag: ea.DeliveryTag, multiple: false); };
BasicAck
用于確認(rèn)消息已經(jīng)被處理。deliveryTag
是消息的標(biāo)識符,multiple
參數(shù)表示是否確認(rèn)多個消息。
7. 運行和測試
- 啟動消費者應(yīng)用程序,確保它可以連接到 RabbitMQ 并等待消息。
- 啟動生產(chǎn)者應(yīng)用程序,它將發(fā)送消息到 RabbitMQ 隊列。
- 消費者將從隊列中接收到消息,并進(jìn)行處理。
如果一切配置正確,您將在控制臺中看到生產(chǎn)者發(fā)送的消息以及消費者處理的消息。
8. 總結(jié)
通過本教程,我們學(xué)習(xí)了如何在 .NET Core 中使用 RabbitMQ 實現(xiàn)一個簡單的消息隊列系統(tǒng)。關(guān)鍵步驟包括:
- 安裝 RabbitMQ 客戶端庫。
- 在生產(chǎn)者中聲明隊列并發(fā)送消息。
- 在消費者中聲明隊列并處理消息。
- 配置消息持久化和確認(rèn)機(jī)制,確保消息的可靠性。
RabbitMQ 是一個強(qiáng)大的消息隊列中間件,適用于各種需要解耦和異步通信的應(yīng)用程序。通過靈活的交換機(jī)和隊列配置,您可以實現(xiàn)不同的消息傳遞模式,以滿足不同的業(yè)務(wù)需求。
到此這篇關(guān)于.NET Core實現(xiàn)RabbitMQ消息隊列的示例代碼的文章就介紹到這了,更多相關(guān).NET Core RabbitMQ消息隊列內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
http轉(zhuǎn)https的實戰(zhàn)記錄(iis 7.5)
這篇文章主要給大家介紹了關(guān)于http轉(zhuǎn)https的相關(guān)資料,文中是最近的一次實戰(zhàn)記錄,基于iis7.5,通過一步步的圖文介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起看看吧。2018-01-01AspNetPager分頁控件源代碼(Version 4.2)
AspNetPager分頁控件源代碼(Version 4.2)...2007-04-04The remote procedure call failed and did not execute的解決辦法
打開IIS隨便訪問一個.asp文件,提示The remote procedure call failed and did not execute2009-11-11Asp.net+jquery+.ashx文件實現(xiàn)分頁思路
分頁思路: .ashx程序中,編寫好取得不同頁碼的程序。在頁面布局好的前提下,留下數(shù)據(jù)區(qū)域 div。然后在頁面請求 .ashx程序生成下一頁的html代碼。覆蓋div.innerHTMl2013-03-03.NET 6開發(fā)TodoList應(yīng)用之實現(xiàn)PUT請求
PUT請求本身其實可說的并不多,過程也和創(chuàng)建基本類似。這篇文章主要為大家介紹了.NET6實現(xiàn)PUT請求的示例詳解,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2021-12-12ASP.NET GridView中文本內(nèi)容無法換行(自動換行/正常換行)
用GridView來顯示課程表,每個單元格的內(nèi)容包括課程名、上課地點、教師姓名,然后我想讓它們分行顯示,感興趣的朋友可以了解下,或許對你有所幫助2013-02-02