日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

RabbitMQ教程C#版 “Hello World”

發布時間:2023/12/4 C# 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 RabbitMQ教程C#版 “Hello World” 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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

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

1.介紹

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

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

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

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

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

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

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

2."Hello World"

2.1.使用.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+。本教程將使用.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

這將創建兩個名為Send和Receive的新目錄。

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

cd Send dotnet add package RabbitMQ.Client dotnet restorecd ../Receivedotnet add package RabbitMQ.Clientdotnet restore

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

2.3.發送

我們將調用我們的消息發布者(發送者)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拉取過來。因此,與發布消息的發布者不同,我們會保持消費者持續不斷地運行,監聽消息并將其打印出來。

代碼(在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官方教程。水平有限,翻譯的不好請見諒,如有翻譯錯誤還請指正。

  • 原文鏈接:RabbitMQ tutorial - "Hello World!"

  • 實驗環境:RabbitMQ 3.7.4 、.NET Core 2.1.3、Visual Studio Code

  • 最后更新:2018-03-13

相關文章:?

  • .net core 使用Redis的發布訂閱

  • RabbitMQ知多少

  • RabbitMQ系列教程之四:路由(Routing)

  • RabbitMQ系列教程之三:發布/訂閱(Publish/Subscribe)

  • RabbitMQ系列教程之二:工作隊列(Work Queues)

  • 如何優雅的使用RabbitMQ

  • .NET 使用 RabbitMQ 圖文簡介

  • RabbitMQ 高可用集群搭建及電商平臺使用經驗總結

  • .NET Core 使用RabbitMQ

  • ASP.NET Core Web API下事件驅動型架構的實現(三):基于RabbitMQ的事件總線

原文地址:http://www.cnblogs.com/esofar/p/rabbitmq-hello-world.html


.NET社區新聞,深度好文,歡迎訪問公眾號文章匯總 http://www.csharpkit.com

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的RabbitMQ教程C#版 “Hello World”的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。