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