RabbitMQ入门HelloWorld(C#)(翻译)
介紹
?
先決條件
本教程假定RabbitMQ已安裝并在標(biāo)準(zhǔn)端口(5672)上的本地主機(jī)上運(yùn)行。如果您使用不同的主機(jī),端口或憑據(jù),連接設(shè)置將需要調(diào)整。
在哪里得到幫助
如果您在閱讀本教程時(shí)遇到困難,可以?通過郵件列表與我們聯(lián)系。
RabbitMQ是一個(gè)消息代理:它接受和轉(zhuǎn)發(fā)消息。你可以把它想象成一個(gè)郵局:當(dāng)你把郵件放在郵箱里時(shí),你可以確定郵差先生最終會(huì)把郵件發(fā)送給你的收件人。在這個(gè)比喻中,RabbitMQ是郵政信箱,郵局和郵遞員。
RabbitMQ與郵局的主要區(qū)別是它不處理紙張,而是接受,存儲(chǔ)和轉(zhuǎn)發(fā)數(shù)據(jù)消息的二進(jìn)制數(shù)據(jù)塊。
RabbitMQ和一般的消息傳遞使用了一些術(shù)語。
-
生產(chǎn)只不過是發(fā)送而已。一個(gè)發(fā)送消息的程序是一個(gè)生產(chǎn)者:
?
-
隊(duì)列是RabbitMQ內(nèi)部的郵箱名稱。盡管消息流經(jīng)RabbitMQ和您的應(yīng)用程序,但它們只能存儲(chǔ)在隊(duì)列中。甲隊(duì)列僅由主機(jī)的存儲(chǔ)器&磁盤限制約束,它本質(zhì)上是一個(gè)大的消息緩沖器。許多生產(chǎn)者可以發(fā)送消息到一個(gè)隊(duì)列,許多消費(fèi)者可以嘗試從一個(gè)隊(duì)列接收數(shù)據(jù)。這就是我們代表隊(duì)列的方式:
?
-
消費(fèi)與接受有類似的意義。一個(gè)消費(fèi)者是一個(gè)程序,主要是等待接收信息:
?
請(qǐng)注意,生產(chǎn)者,消費(fèi)者和經(jīng)紀(jì)人不必駐留在同一主機(jī)上;?事實(shí)上在大多數(shù)應(yīng)用程序中,他們沒有
?
“你好,世界”
(使用.NET / C#客戶端)
在本教程的這一部分,我們將用C#編寫兩個(gè)程序。發(fā)送單個(gè)消息的生產(chǎn)者,以及接收消息并將其打印出來的消費(fèi)者。我們將詳細(xì)介紹.NET客戶端API中的一些細(xì)節(jié),僅僅著重于這個(gè)非常簡(jiǎn)單的事情來開始。這是一個(gè)消息傳遞的“Hello World”。
在下圖中,“P”是我們的生產(chǎn)者,“C”是我們的消費(fèi)者。中間的盒子是一個(gè)隊(duì)列 - 一個(gè)RabbitMQ代表消費(fèi)者的消息緩沖區(qū)。
.NET客戶端庫(kù)
RabbitMQ提供多種協(xié)議。本教程使用AMQP 0-9-1,這是一個(gè)開放,通用的消息傳遞協(xié)議。RabbitMQ有許多不同的語言客戶端。我們將使用RabbitMQ提供的.NET客戶端。
客戶端支持.NET Core以及.NET Framework 4.5.1+。本教程將使用RabbitMQ .NET客戶端5.0和.NET核心,因此您將確保您已安裝并在PATH中。
您也可以使用.NET Framework來完成本教程,但設(shè)置步驟會(huì)有所不同。
RabbitMQ .NET客戶端5.0和更高版本通過nuget分發(fā)。
本教程假定您在Windows上使用PowerShell。在MacOS和Linux上,幾乎所有的shell都可以運(yùn)行。
建立
首先讓我們驗(yàn)證你在PATH中有.NET Core工具鏈:
dotnet --help應(yīng)該產(chǎn)生一個(gè)幫助信息。
現(xiàn)在讓我們生成兩個(gè)項(xiàng)目,一個(gè)是發(fā)布者,另一個(gè)是消費(fèi)者:
dotnet new console --name Send mv Send/Program.cs Send/Send.cs dotnet new console --name Receive mv Receive/Program.cs Receive/Receive.cs這將創(chuàng)建兩個(gè)名為發(fā)送和接收的新目錄。
然后我們添加客戶端依賴項(xiàng)。
cd Send dotnet add package RabbitMQ.Client dotnet restore cd ../Receive dotnet add package RabbitMQ.Client dotnet restore現(xiàn)在我們已經(jīng)建立了.NET項(xiàng)目,我們可以編寫一些代碼。
發(fā)出
我們將調(diào)用我們的消息發(fā)布者(發(fā)送者)Send.cs和我們的消息使用者(接收者)?Receive.cs。發(fā)布者將連接到RabbitMQ,發(fā)送一條消息,然后退出。
在?Send.cs中,我們需要使用一些命名空間:
using System; using RabbitMQ.Client; using System.Text;設(shè)置課程:
class Send {public static void Main() { ... } }那么我們可以創(chuàng)建一個(gè)到服務(wù)器的連接:
class Send {public static void Main() { var factory = new ConnectionFactory() { HostName = "localhost" }; using (var connection = factory.CreateConnection()) { using (var channel = connection.CreateModel()) { ... } } } }連接抽象出套接字連接,并為我們處理協(xié)議版本協(xié)商和認(rèn)證等。在這里,我們連接到本地機(jī)器上的代理 - 因此是?本地主機(jī)。如果我們想連接到另一臺(tái)機(jī)器上的經(jīng)紀(jì)人,我們只需在此指定其名稱或IP地址。
接下來我們創(chuàng)建一個(gè)頻道,這是完成大部分API的地方。
發(fā)送,我們必須申報(bào)隊(duì)列給我們發(fā)送;?那么我們可以發(fā)布消息到隊(duì)列中:
using System; using RabbitMQ.Client; using System.Text;class Send { public static void Main() { var factory = new ConnectionFactory() { HostName = "localhost" }; using(var connection = factory.CreateConnection()) using(var channel = connection.CreateModel()) { channel.QueueDeclare(queue: "hello", durable: false, exclusive: false, autoDelete: false, arguments: null); string message = "Hello World!"; var body = Encoding.UTF8.GetBytes(message); channel.BasicPublish(exchange: "", routingKey: "hello", basicProperties: null, body: body); Console.WriteLine(" [x] Sent {0}", message); } Console.WriteLine(" Press [enter] to exit."); Console.ReadLine(); } }聲明一個(gè)隊(duì)列是冪等的 - 只有當(dāng)它不存在時(shí)才會(huì)被創(chuàng)建。消息內(nèi)容是一個(gè)字節(jié)數(shù)組,所以你可以編碼任何你喜歡的地方。
當(dāng)上面的代碼完成運(yùn)行時(shí),通道和連接將被處理。這是我們的出版商。
這是整個(gè)Send.cs類。
發(fā)送不起作用!
如果這是您第一次使用RabbitMQ,并且您沒有看到“已發(fā)送”消息,那么您可能會(huì)抓住您的腦袋,想知道會(huì)出現(xiàn)什么問題。也許代理啟動(dòng)時(shí)沒有足夠的可用磁盤空間(默認(rèn)情況下它至少需要50 MB空間),因此拒絕接受消息。檢查代理日志文件以確認(rèn)并在必要時(shí)減少限制。該配置文件文檔會(huì)告訴你如何設(shè)置disk_free_limit。
接收
至于消費(fèi)者,它是從RabbitMQ推送消息。因此,與發(fā)布單個(gè)消息的發(fā)布者不同,我們將不斷地運(yùn)行消費(fèi)者來收聽消息并將其打印出來。
代碼(在Receive.cs中)與Send有幾乎相同的使用語句:
using RabbitMQ.Client; using RabbitMQ.Client.Events; using System; using System.Text;設(shè)置與發(fā)布者相同;?我們打開一個(gè)連接和一個(gè)通道,并聲明我們將要使用的隊(duì)列。請(qǐng)注意,這與發(fā)送到發(fā)布的隊(duì)列相匹配。
class Receive {public static void Main() { var factory = new ConnectionFactory() { HostName = "localhost" }; using (var connection = factory.CreateConnection()) { using (var channel = connection.CreateModel()) { channel.QueueDeclare(queue: "hello", durable: false, exclusive: false, autoDelete: false, arguments: null); ... } } } }請(qǐng)注意,我們也在這里聲明隊(duì)列。因?yàn)槲覀兛赡軙?huì)在發(fā)布者之前啟動(dòng)消費(fèi)者,所以我們希望確保隊(duì)列存在,然后再嘗試使用消息。
我們即將告訴服務(wù)器將隊(duì)列中的消息傳遞給我們。由于它會(huì)異步推送消息,因此我們提供回調(diào)。這就是EventingBasicConsumer.Received事件處理程序所做的事情。
using RabbitMQ.Client; using RabbitMQ.Client.Events; using System; using System.Text;class Receive { public static void Main() { var factory = new ConnectionFactory() { HostName = "localhost" }; using(var connection = factory.CreateConnection()) using(var channel = connection.CreateModel()) { channel.QueueDeclare(queue: "hello", durable: false, exclusive: false, autoDelete: false, arguments: null); var consumer = new EventingBasicConsumer(channel); consumer.Received += (model, ea) => { var body = ea.Body; var message = Encoding.UTF8.GetString(body); Console.WriteLine(" [x] Received {0}", message); }; channel.BasicConsume(queue: "hello", autoAck: true, consumer: consumer); Console.WriteLine(" Press [enter] to exit."); Console.ReadLine(); } } }這是整個(gè)Receive.cs類。
把它放在一起
打開兩個(gè)終端。
運(yùn)行消費(fèi)者:
cd Receive dotnet run然后運(yùn)行生產(chǎn)者:
cd Send dotnet run消費(fèi)者將通過RabbitMQ打印從發(fā)布者處獲得的消息。消費(fèi)者將繼續(xù)運(yùn)行,等待消息(使用Ctrl-C停止它),所以嘗試從另一個(gè)終端運(yùn)行發(fā)布者。
轉(zhuǎn)載于:https://www.cnblogs.com/moyhui/p/8309062.html
新人創(chuàng)作打卡挑戰(zhàn)賽發(fā)博客就能抽獎(jiǎng)!定制產(chǎn)品紅包拿不停!總結(jié)
以上是生活随笔為你收集整理的RabbitMQ入门HelloWorld(C#)(翻译)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VueJs记录
- 下一篇: Codeforces 570D Tre