【c#】RabbitMQ學習文檔(一)Hello World

一、簡介

????? RabbitMQ是一個消息的代理器,用于接收和發送消息,你可以這樣想,他就是一個郵局,當您把需要寄送的郵件投遞到郵筒之時,你可以確定的是郵遞員先生肯定會把郵件發送到需要接收郵件的人的手里,不會送錯的。在這個比喻中,RabbitMQ就是一個郵箱,也可以理解為郵局和郵遞員,他們負責把消息發送出去和用于接收信息。

?? RabbitMQ和郵局這兩者之間的主要區別是它不會處理紙質郵件,取而代之的是接收、存儲和發送二進制數據塊,也就是我們通常所說的消息。

?? RabbitMQ和消息中,通常會使用一些專業術語。

?? 生產:生產意味著就是發送。 發送消息的程序是一個生產者。下圖代表一個消息的生產真:

????

? ?隊列:這里的隊列是指一個名稱,但是名稱所代表的隊列實體寄存在RabbitMQ服務器端中。 雖然消息流過RabbitMQ和您的應用程序,但它們只能存儲在隊列中。 隊列只受主機的內存和磁盤的限制,它本質上是一個大的消息緩沖區。 許多生產者可以發送消息到一個隊列,許多消費者可以嘗試從一個隊列接收數據。 下圖代表一個隊列:

???

? ?消費:消費具有與接收相似的含義。 消費者是一個主要等待接收消息的程序。下圖代表消息的消費者:

????

二、(使用 Net/C# 客戶端)

?? 在這篇教程中我們將用C#寫兩個程序;一個是生產者,用于發送一個簡單消息;一個是消費者,用于接收消息和把他們打印出來。我們將忽略一些.NET API的詳細信息,專注于更簡單的開始。這是一個關于"Hello World"簡單的小例子。

?? 在下圖中, "P"是我們的消息生產者,"C"是我們消息的消費者。在中間的紅色矩形框代表一個隊列,也就是消息的緩沖區,RabbitMQ代表是消息的消費者。

(P) -> [|||] -> (C)



?? Net客戶端類庫

???? RabbitMQ支持多種協議,本教程使用AMQP 0-9-1,這是一個針對消息的開放的、通用的協議。RabbitMQ使用了多種語言開發了針對不同環境的客戶端。下面我們將使用由RabbitMQ提供的Net客戶端。

??? 這個客戶端類庫支持.NET Core以及.NET Framework 4.5.1 以上的版本。本教程將使用.NET Core,以便確保您安裝在您的路徑中。

??? 你也可以使用 Net Framework 來完成本實例,只是安裝步驟有些不同而已。

??? RabbitMQ的客戶端類庫已經部署到了NuGet上,并且您可以通過NuGet下載和使用。

??? 本教程假定您正在使用Windows PowerShell。


三、安裝

?? 首先讓我們確認您已經有了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 restore
cd ../Receive
dotnet add package RabbitMQ.Client
dotnet restore
復制代碼

? 現在我們已經有了兩個項目安裝完畢,可以開始寫一些代碼了。

四、發送消息

?????????   (P) -> [|||]

?? 我們會調用我們的消息發布者(發送者)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()){...}}}}
復制代碼

??? 當前connection連接是一個抽象的套接字連接,為我們負責協議版本的協商和認證等。這里我們連接到本地機器上的消息代理--從此處的localhost關鍵字可以看出是本機。如果我們想連接到另一臺機器上的一個消息代理,我們只需在這里指定它的名稱或IP地址。

??? 接下來,我們創建一個通道,這個API的主要功能就是把獲得信息保存起來

??? 要發送,我們必須聲明一個隊列,然后我們把消息發送到這個隊列里面:

復制代碼
 1  using System;
 2        using RabbitMQ.Client;
 3        using System.Text;
 4 
 5        class Send
 6        {
 7            public static void Main()
 8            {
 9                var factory = new ConnectionFactory() { HostName = "localhost" };
10                using(var connection = factory.CreateConnection())
11                using(var channel = connection.CreateModel())
12                {
13                    channel.QueueDeclare(queue: "hello",
14                                  durable: false,
15                                  exclusive: false,
16                                  autoDelete: false,
17                                  arguments: null);
18 
19                    string message = "Hello World!";
20                    var body = Encoding.UTF8.GetBytes(message);
21 
22                    channel.BasicPublish(exchange: "",
23                                  routingKey: "hello",
24                                  basicProperties: null,
25                                  body: body);
26                    Console.WriteLine(" [x] Sent {0}", message);
27                }
28 
29                Console.WriteLine(" Press [enter] to exit.");
30                Console.ReadLine();
31            }
32        }
復制代碼


??? 聲明隊列是一次性的,只有當它不存在時才會被創建。消息內容是字節數組,所以您可以編碼任何您喜歡的內容。

??? 當上面的代碼完成運行時,通道和連接將被釋放。

??? 發送不成功的解決辦法

??? 如果這是您第一次使用RabbitMQ發送消息,但是你并沒有看到“發送”的消息,那么你可能會撓著頭想知道錯誤在什么地方。也許消息代理開始沒有足夠的可用磁盤空間(默認情況下,它需要至少50 MB),因此拒絕接受消息。必要時檢查代理日志文件來確認和減少限制。配置文件的文檔會告訴你如何設置disk_free_limit。


五、接收消息

???? 以上就是我們的消息生產者,我們的消息的消費者是從RabbitMQ拉消息,因此不能像我們的消息發布者那樣發布單一消息,我們需要保持我們的消費者程序持續運行,并且監聽消息,如果有就獲取并且打印出來。

[|||] -> (C)


???? Receive.cs文件和Send.cs文件有一些很像的代碼需要書寫:

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

???? 消息接收者的設置和消息的發布者一樣,我們要打開一個連接和一個通道,并且聲明一個從中獲取消息的隊列,注意這個是和Send.cs文件中的發布者的隊列相匹配的。

復制代碼
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接收事件處理程序所做的。

復制代碼
 1 using RabbitMQ.Client;
 2        using RabbitMQ.Client.Events;
 3        using System;
 4        using System.Text;
 5 
 6        class Receive
 7        {
 8            public static void Main()
 9            {
10               var factory = new ConnectionFactory() { HostName = "localhost" };
11               using(var connection = factory.CreateConnection())
12               using(var channel = connection.CreateModel())
13               {
14                    channel.QueueDeclare(queue: "hello",
15                                  durable: false,
16                                  exclusive: false,
17                                  autoDelete: false,
18                                  arguments: null);
19 
20                    var consumer = new EventingBasicConsumer(channel);
21                    consumer.Received += (model, ea) =>
22                    {
23                        var body = ea.Body;
24                        var message = Encoding.UTF8.GetString(body);
25                        Console.WriteLine(" [x] Received {0}", message);
26                    };
27                   channel.BasicConsume(queue: "hello",   noAck: true,    consumer: consumer);
28 
29                    Console.WriteLine(" Press [enter] to exit.");
30                    Console.ReadLine();
31                }
32            }
33        }
復制代碼


六、把它放在一起

??? 打開兩個端點。

??? 運行消費者:
?
?????? cd Receive

?????? dotnet run

??? 然后運行生產者

?????? cd Send

?????? dotnet Run

??? 消費者將要打印消息生產者通過RabbitMQ發布的消息。消費者不能間斷,必須保持持續運行,等待新消息的到來。當然也可以通過(Ctrl+C 來停止消費者)

??? 好了,終于寫完了,其實是我翻譯的,有翻譯不對的地方請諒解。

??? 原文地址如下:http://www.rabbitmq.com/tutorials/tutorial-one-dotnet.html

轉載于:https://www.cnblogs.com/wyt007/p/9065639.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/452632.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/452632.shtml
英文地址,請注明出處:http://en.pswp.cn/news/452632.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

什么是狀態轉換圖

通過描繪系統的狀態及引起系統狀態轉換的事件,來表示系統的行為。此外狀態轉換圖還指明了作為特定事件的結果系統將做哪些動作(例如,處理數據)。因此狀態轉換圖提供了行為建模機制。

Python學習筆記三

參考教程:廖雪峰官網https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000 一、函數的定義 Python中定義一個函數需要使用def語句,依次確定函數名、參數及函數體內容: #一個求絕對值的函數 def my_abs(x):i…

oracle中如何分頁,Oracle中操作分頁

mysql中分頁的寫法:select t.* from tbl_user t order by t.id limit $offset , $perpage$currentPage 1;//當前頁碼其中后面$sql:with partdata as (select rownum rowno,t.* from tablename t where column1090order by column) select * from partda…

Flask愛家租房--發布新房源(保存房屋圖片)

0.頁面展示效果 1)首先房東填寫房屋信息; 2)當房東填寫發布的房源信息之后,隱藏(hide)剛才填寫信息的界面,同時顯示(show)上傳房屋圖片的界面。 1.后端代碼 api.route("/houses/image&q…

數字的處理 :小數點四舍五入

js取float型小數點后兩位數的方法 轉載 發布時間:2014年01月18日 17:03:32 投稿:shangke 我要評論 js中取小數點后兩位方法最常用的就是四舍五入函數了,前面我介紹過js中四舍五入一此常用函數,這里正好用上,下面…

如何成為一名優秀的C程序員

問題的提出 每過一段時間我總會收到一些程序員發來的電子郵件,他們會問我是用什么編程語言來編寫自己的游戲的,以及我是如何學習這種編程語言的。因此,我認為在這篇博文里列出一些有關C語言的最佳讀物應該能幫到不少人。如果你知道其它的優秀…

CFS調度器

一、前言 隨著內核版本的演進,其源代碼的膨脹速度也在遞增,這讓Linux的學習曲線變得越來越陡峭了。這對初識內核的同學而言當然不是什么好事情,滿腔熱情很容易被當頭澆滅。我有一個循序漸進的方法,那就是先不要看最新的內核&#…

oracle索引分類與區分,深入理解Oracle表(6):堆組織表(HOT)和索引組織表(IOT)的區別...

摘要:堆表:又稱堆組織表,常用的表類型,以堆的方式管理,當增加數據時,將使用段中第一個適合數據大小的空閑空間。當刪除數據時,留下的空間允許以后的DML操作重用。 堆組織表(heap table)應用中99…

Flask愛家租房--發布新房源(總結)

重點總結 學習過程中,發現house_id貫穿兩個接口內容,現對后端邏輯部分做以下總結: 1)房東首先在前端填寫房屋的基本信息,此時通過newhouse.js文件$("#form-house-info").submit(function (e) {…}進行處理&…

關系的三類完整性約束

規則2.1實體完整性規則(Entity Integrity)若屬性A是基本關系R的主屬性,則屬性A不能取空值空值就是“不知道”或“不存在”或“無意義”的值例: 選修(學號,課程號,成績) “學號、課…

[QNAP crontab 定時執行程式

注意要自動執行的 sh 檔不要放在 /root 裡, 不然韌體更新後檔案會不見, 要放在個人帳號的資料夾,例如 /share/homes/帳號/ QNAP 的 crontab 放在 /etc/config/crontabvi /etc/config/crontab 例如要每日5:00執行 backup.sh 的話,加上這行 00 5 * * * /s…

調整標志位方法oracle,面試題(二)(示例代碼)

1.查找/us/oc al/nginx/ogs下更改時間在7天前以log 后極的文件井移動到sr/oca/nginx/log/backup下(至少兩種方法)2. Centos 查看某個進程的環境安量3.簡述DNS迭代查詢和遞歸直詢的區別4.簡述TCP三次握手過程以及涉及到的狀態(可畫草圖) ?5.統計TCP連接狀態(至少兩種方法)6.發現…

國際最具潛力IT專業認證

正如很多的爭論一樣,IT認證也是現在爭論的熱點,在IT專業人士的世界里,IT認證對于其職業規劃有著很大的影響。在時下究竟哪個認證才具有最大意義呢?本文羅列了十個最具潛力的技術認證,一起來看看都有哪些吧!…

關系代數

關系代數是一種抽象的查詢語言,它用對關系的運算來表達查詢關系代數運算對象是關系運算結果亦為關系關系代數的運算符有兩類:集合運算符和專門的關系運算符

設計模式的六大原則

設計模式是一套被反復使用、多數人知曉的、經過分類編目的、代碼設計經驗的總結。使用設計模式是為了可重用代碼、讓代碼更加容易被他人理解、保證代碼可靠性。設計模式是代碼編制真正工程化(工程化即系統化、模塊化、規范化的一個過程。指將具有一定規模數量的單個…

作業7

stuNum 201709090072 print(年級是:stuNum[0:4]) print(專業編號是: stuNum[4:9]) print(序號是: stuNum[-3:]) stuNum 440982201812111876 print(所在省市:stuNum[0:2]) print(所在地區:stuNum[2:4]) print(所在縣區:stuNum[4:…

linux進程退出沒有log,Linux下應用進程消失原因分析-Go語言中文社區

應用部署在Linux環境下,如果出現未知原因導致應用進程被殺(應用日志中沒有任何異常現象,日志出現中斷現象),如果對于進程消失原因沒有特別明確的方向,可以考慮從系統日志(/var/log/messages)方面查找原因。 命令參考egrep -i kill…

數學是成就卓越開發人員的必備技能

編者按:原文作者Alan Skorkin是一名軟件開發人員,他在博客中分享對軟件開發相關的心得,其中有很多優秀的文章,本文就是其中一篇,作者認為:成為優秀的開發人員,可以沒有數學技能,但成…

Flask愛家租房--celery(總結)

0. celery整體邏輯圖 個人理解為:此處的客戶端client與以往定義的客戶端(前端)并不一樣,角色相當于以往的后端邏輯處理代碼,即發布任務的一方,只是相當于處理者worker而言是客戶端。 1.準備工作&#xff1…