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