[譯]RabbitMQ教程C#版 - “Hello World”

来源:https://www.cnblogs.com/esofar/archive/2018/03/14/rabbitmq-hello-world.html
-Advertisement-
Play Games

先決條件 本教程假定RabbitMQ已經安裝,並運行在 標準埠(5672)。如果你使用不同的主機、埠或證書,則需要調整連接設置。 從哪裡獲得幫助 如果您在閱讀本教程時遇到困難,可以通過郵件列表 "聯繫我們" 。 1.介紹 RabbitMQ是一個消息代理:它接受並轉發消息。您可以把它想象成一個郵局 ...


先決條件
本教程假定RabbitMQ已經安裝,並運行在localhost標準埠(5672)。如果你使用不同的主機、埠或證書,則需要調整連接設置。

從哪裡獲得幫助
如果您在閱讀本教程時遇到困難,可以通過郵件列表聯繫我們

1.介紹

RabbitMQ是一個消息代理:它接受並轉發消息。您可以把它想象成一個郵局:當您將需要寄出的郵件投遞到郵箱,您可以確定的是郵差先生最終會將郵件送給您的收件人。在這個比喻中,RabbitMQ就是一個郵箱,也可以理解成郵局和郵遞員。

RabbitMQ和郵局的主要區別在於它不處理紙張,而是接收、存儲和轉發二進位數據塊 - 消息

RabbitMQ和消息傳遞通常使用一些術語。

生產的意思無非就是發送。發送消息的程式就是一個生產者

Producer

隊列就是RabbitMQ內部“郵箱”的名稱。雖然消息流經RabbitMQ和您的應用程式,但它們只能存儲在隊列中。隊列只受主機的記憶體和磁碟的限制,它本質上就是一個很大的消息緩衝區。多個生產者可以發送消息到一個隊列,並且多個消費者可以嘗試從一個隊列接收數據。這就是我們代表隊列的方式:

Queue

消費與接收有相似的含義。主要等待接收消息的程式就是一個消費者

Consumer

註意:生產者、消費者和中間件不是必須部署在同一主機上,實際上在大多數應用程式中它們不是。

2."Hello World"

2.1.使用.NET / C#客戶端

在教程的這一部分,我們將用C#編寫兩個程式:一個發送單條消息的生產者,以及接收消息並將其列印出來的消費者。我們將忽略.NET客戶端API中的一些細節,專註於更簡單的開始。這是一個消息傳遞的“Hello World”。

在下圖中,“P”是我們的生產者,“C”是我們的消費者。中間的盒子是隊列 - RabbitMQ代表消費者保存的消息緩衝區。

image

.NET客戶端庫
RabbitMQ支持多種協議,本教程使用AMQP 0-9-1,它是一種開放的、通用的消息傳遞協議。RabbitMQ提供了一些針對不同語言環境的客戶端,我們將使用RabbitMQ提供的.NET客戶端。

客戶端支持.NET Core以及.NET Framework 4.5.1+。本教程將使用.NET Core,因此您需要確保客戶端已安裝並且路徑添加到PATH系統變數。

您也可以使用.NET Framework來完成本教程,但設置步驟會有所不同。

RabbitMQ .NET客戶端5.0及更高版本通過nuget發佈。

本教程假定您在Windows上使用PowerShell。在MacOS和Linux上,幾乎所有shell也都可以正常工作。

2.2.安裝

首先讓我們驗證您在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

這將創建兩個名為SendReceive的新目錄。

然後,我們添加客戶端依賴項。

cd Send
dotnet add package RabbitMQ.Client
dotnet restore
cd ../Receive
dotnet add package RabbitMQ.Client
dotnet restore

我們已經建立了.NET項目,現在我們可以編寫一些代碼。

2.3.發送

Sending

我們將調用我們的消息發佈者(發送者)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())
            {
                ...
            }
        }
    }
}

該連接抽象了套接字連接,併為我們處理協議版本的協商和身份驗證等。在這裡,我們連接的是本地機器上的代理, 因此是localhost。如果我們想連接到其他機器上的代理,我們只需在此指定其名稱或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();
    }
}

聲明隊列是冪等的 - 只有當它不存在時才會被創建。消息內容是一個位元組數組,所以您可以用喜歡的任意方式編碼。

當上面的代碼完成運行時,通道和連接將被釋放。這就是我們的發佈者。

發送不起作用!
如果這是您第一次使用RabbitMQ,並且您沒有看到“已發送”消息,那麼您可能會撓著頭想知道錯誤出在什麼地方。也許是代理程式啟動時沒有足夠的可用磁碟空間(預設情況下,它至少需要50 MB空閑空間),因此拒絕接收消息。
必要時檢查代理程式日誌文件來確認和減少限制。配置文件文檔將告訴您如何設置disk_free_limit

2.4.接收

至於消費者,它是把消息從RabbitMQ拉取過來。因此,與發佈消息的發佈者不同,我們會保持消費者持續不斷地運行,監聽消息並將其列印出來。

Receiving

代碼(在Receive.cs中)具有與Send差不多一樣的using聲明:

using RabbitMQ.Client;
using RabbitMQ.Client.Events;
using System;
using System.Text;

設置與發佈者相同;我們開啟一個連接和一個通道,並聲明我們將要使用的隊列。請註意,這需要與Send發佈到的隊列相匹配。

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();
        }
    }
}

2.5.組合在一起

打開兩個終端。

運行消費者:

cd Receive
dotnet run

運行生產者:

cd Send
dotnet run

消費者將列印它通過RabbitMQ從發佈者處獲得的消息。消費者將繼續運行、等待新消息(按Ctrl-C將其停止),可以嘗試從開啟另一個終端運行發佈者。

3.寫在最後

本文翻譯自RabbitMQ官方教程。水平有限,翻譯的不好請見諒,如有翻譯錯誤還請指正。

作者:Esofar

出處:http://www.cnblogs.com/esofar/p/rabbitmq-hello-world.html

本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...