【微服務專題之】.Net6下集成消息隊列-RabbitMQ交換機模式代碼演示(全)

微信公眾號:趣編程ACE
關注可了解更多的.NET日常實戰開發技巧,如需源碼 請公眾號后臺留言 源碼;
[如果覺得本公眾號對您有幫助,歡迎關注]

.Net中RabbitMQ中交換機模式的使用

前文回顧

【微服務專題之】.Net6下集成消息隊列上-RabbitMQ

【微服務專題之】.Net6下集成消息隊列2-RabbitMQ

【微服務專題之】.Net6中集成消息隊列-RabbitMQ中直接路由模式

TopicExchange 交換機模式

如果我們需要將一條信息發送到多個隊列上,假若利用直連模式,那么就會有很多的路由,而TopicExchange只需要配置定義好的路由規則,即可省略多余的路由指定。
PS:路由規則有一定的約束,比如需要采取* .#. * 的格式,用.號 分隔
其中

  • 1.*表示一個單詞

  • 2. #表示任意數量(零個或多個)單詞。

消費者程序演示

public?static?class?TopicExchangeReceive{public?static?void?Receive(IModel?channel){channel.ExchangeDeclare("hello-topic-exchange",?ExchangeType.Topic);channel.QueueDeclare(queue:?"hello-topic-queue",durable:?true,exclusive:?false,autoDelete:?false,arguments:?null);channel.QueueBind("hello-topic-queue",?"hello-topic-exchange",?"route.*");//channel.QueueBind("hello",?"hello-direct-exchange",?"route2");//?創建一個消費者基本事件var?consumer?=?new?EventingBasicConsumer(channel);consumer.Received?+=?(model,?ea)?=>{var?body?=?ea.Body.ToArray();var?message?=?Encoding.UTF8.GetString(body);Console.WriteLine("?[x]?Received?{0}",?message);};channel.BasicConsume(queue:?"hello-topic-queue",//?自動確認autoAck:?true,consumer:?consumer);//channel.BasicConsume(queue:?"hello",//?????????????????????//?自動確認//?????????????????????autoAck:?true,//?????????????????????consumer:?consumer);Console.WriteLine("?Press?[enter]?to?exit.");Console.ReadLine();}}

生產者程序演示

public?static?class?TopicExchangeSend{public?static?void?Send(IModel?channel){channel.ExchangeDeclare("hello-topic-exchange",?ExchangeType.Topic);var?count?=?0;while?(true){Thread.Sleep(1000);//?發送的消息string?message?=?$"Hello?World?{count}";var?body?=?Encoding.UTF8.GetBytes(message);//var?body2?=?Encoding.UTF8.GetBytes(message?+?"body2");//?基本發布?不指定交換channel.BasicPublish(exchange:?"hello-topic-exchange",//?路由鍵???就是隊列名稱routingKey:?"route.2",//?基礎屬性basicProperties:?null,//?傳遞的消息體body:?body);//channel.BasicPublish(exchange:?"hello-direct-exchange",//?????????????????????//?路由鍵???就是隊列名稱//?????????????????????routingKey:?"route2",//?????????????????????//?基礎屬性//?????????????????????basicProperties:?null,//?????????????????????//?傳遞的消息體//?????????????????????body:?body2);count++;Console.WriteLine("?[x]?sent?{0}",?message);}}}

效果展示

df9adbb5ccee2cb176b56cc0f37a9d94.gif


Headers Exchange 模式

其實這種模式類似與Http請求里面的headers,我們定義一個字典然后通過交換機攜帶,作為交換機與路由器交換媒介,相比于Topic Exchange交換模式,header定義的格式類型更加豐富。

消費者程序演示

public?static?class?HeadersExchangeReceive{public?static?void?Receive(IModel?channel){channel.ExchangeDeclare("hello-headers-exchange",?ExchangeType.Headers);channel.QueueDeclare(queue:?"hello-headers-queue",durable:?true,exclusive:?false,autoDelete:?false,arguments:?null);var?headers?=?new?Dictionary<string,?object>(){{"test","A"?}};channel.QueueBind("hello-headers-queue",?"hello-headers-exchange",?String.Empty,?headers);//channel.QueueBind("hello",?"hello-direct-exchange",?"route2");//?創建一個消費者基本事件var?consumer?=?new?EventingBasicConsumer(channel);consumer.Received?+=?(model,?ea)?=>{var?body?=?ea.Body.ToArray();var?message?=?Encoding.UTF8.GetString(body);Console.WriteLine("?[x]?Received?{0}",?message);};channel.BasicConsume(queue:?"hello-headers-queue",//?自動確認autoAck:?true,consumer:?consumer);//channel.BasicConsume(queue:?"hello",//?????????????????????//?自動確認//?????????????????????autoAck:?true,//?????????????????????consumer:?consumer);Console.WriteLine("?Press?[enter]?to?exit.");Console.ReadLine();}}

生產者程序演示

public?static?void?Send(IModel?channel){channel.ExchangeDeclare("hello-headers-exchange",?ExchangeType.Headers);var?count?=?0;while?(true){Thread.Sleep(1000);//?發送的消息string?message?=?$"Hello?World?{count}";var?body?=?Encoding.UTF8.GetBytes(message);//var?body2?=?Encoding.UTF8.GetBytes(message?+?"body2");var?basicProperties?=?channel.CreateBasicProperties();basicProperties.Headers?=?new?Dictionary<string,?object>(){{"test"?,"A"}};//?基本發布?不指定交換channel.BasicPublish(exchange:?"hello-headers-exchange",//?路由鍵???就是隊列名稱routingKey:?String.Empty,//?基礎屬性basicProperties,//?傳遞的消息體body:?body);//channel.BasicPublish(exchange:?"hello-direct-exchange",//?????????????????????//?路由鍵???就是隊列名稱//?????????????????????routingKey:?"route2",//?????????????????????//?基礎屬性//?????????????????????basicProperties:?null,//?????????????????????//?傳遞的消息體//?????????????????????body:?body2);count++;Console.WriteLine("?[x]?sent?{0}",?message);}}

效果演示

d8ddbf827265221bfd3303b4b4ceab51.gif


FanoutExchange 模式

扇形交換機模式是最傻瓜的一種交換模式,總的而言只要將隊列綁定到交換機上,就能做到消息互通了。當然了這種機制處理事件的速度也是所有交換機類型里面最快的。

消費者程序演示

public?static?class?FanoutExchangeReceive{public?static?void?Receive(IModel?channel){channel.ExchangeDeclare("hello-fanout-exchange",?ExchangeType.Fanout);channel.QueueDeclare(queue:?"hello-fanout-queue",durable:?true,exclusive:?false,autoDelete:?false,arguments:?null);//var?headers?=?new?Dictionary<string,?object>()//{//????{"test","A"?}//};channel.QueueBind("hello-fanout-queue",?"hello-fanout-exchange",?String.Empty);//channel.QueueBind("hello",?"hello-direct-exchange",?"route2");//?創建一個消費者基本事件var?consumer?=?new?EventingBasicConsumer(channel);consumer.Received?+=?(model,?ea)?=>{var?body?=?ea.Body.ToArray();var?message?=?Encoding.UTF8.GetString(body);Console.WriteLine("?[x]?Received?{0}",?message);};channel.BasicConsume(queue:?"hello-fanout-queue",//?自動確認autoAck:?true,consumer:?consumer);//channel.BasicConsume(queue:?"hello",//?????????????????????//?自動確認//?????????????????????autoAck:?true,//?????????????????????consumer:?consumer);Console.WriteLine("?Press?[enter]?to?exit.");Console.ReadLine();}

生產者程序演示

public?static?class?FanoutExchangeSend{public?static?void?Send(IModel?channel){channel.ExchangeDeclare("hello-fanout-exchange",?ExchangeType.Fanout);var?count?=?0;while?(true){Thread.Sleep(1000);//?發送的消息string?message?=?$"Hello?World?{count}";var?body?=?Encoding.UTF8.GetBytes(message);//var?body2?=?Encoding.UTF8.GetBytes(message?+?"body2");//var?basicProperties?=?channel.CreateBasicProperties();//basicProperties.Headers?=?new?Dictionary<string,?object>()//{//????{"test"?,"A"}//};//?基本發布?不指定交換channel.BasicPublish(exchange:?"hello-fanout-exchange",//?路由鍵???就是隊列名稱routingKey:?String.Empty,//?基礎屬性null,//?傳遞的消息體body:?body);//channel.BasicPublish(exchange:?"hello-direct-exchange",//?????????????????????//?路由鍵???就是隊列名稱//?????????????????????routingKey:?"route2",//?????????????????????//?基礎屬性//?????????????????????basicProperties:?null,//?????????????????????//?傳遞的消息體//?????????????????????body:?body2);count++;Console.WriteLine("?[x]?sent?{0}",?message);}}}

效果演示

55619596d752c72a6e4d1428b248f916.gif


PS:具體的代碼效果演示看視頻哦~

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

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

相關文章

【專升本計算機】甘肅省專升本計算機基礎--判斷題--匯編(737道帶答案)

馮?諾依曼原理是計算機的唯一工作原理。(  )計算機能直接識別匯編語言程序。(  )計算機能直接執行高級語言源程序。(  )計算機掉電后,ROM中的信息會丟失。(  )計算機掉電后,外存中的信息會丟失。( √ )應用軟件的作用是擴大計算機的存儲容量。(  )操…

thinkphp中表有前綴名的時候申明模板的方法

$Modelnew \Home\Model\Stu_activityModel; $ModelD(Stu_activity);//錯誤的聲明不了轉載于:https://www.cnblogs.com/jianxin-lilang/p/6242416.html

OK335xS psplash make-image-header.sh hacking

/****************************************************************************** OK335xS psplash make-image-header.sh hacking* 說明&#xff1a;* 移植的時候想知道移植psplash中./make-image-header.sh Screenshot.png POKY* 最后的POKY為什么要指定&am…

SDWebImage 4 0 遷移指南

剛剛更新pods 編譯程序,突然發現SDWebImage報錯 了解到SDWebImage4.0 更換了不少方法&#xff0c;還增加了幾個類&#xff0c;索性都研究一下pod 更新SDWebImage版本為4.1.0 查找是否有對應緩存的 方法 由返回BOOL 值 換成Block回調中參數返回BOOL值 //老版本 BOOL isInCache …

C語言試題181之實現strcat函數

??個人主頁:個人主頁 ??系列專欄:C語言試題200例 ??推薦一款刷算法、筆試、面經、拿大公司offer神器?? 點擊跳轉進入網站 ?作者簡介:大家好,我是碼莎拉蒂,CSDN博客專家(全站排名Top 50),阿里云博客專家、51CTO博客專家、華為云享專家 1、題目 題目: 實現st…

通宵爆肝:C語言下的平衡二叉樹(Avl)原來如此簡單!

文章目錄平衡二叉樹的構造過程1 算法描述平衡二叉樹的編程1 樹上結點的高度計算2 LL調整函數3 RR調整函數4 LR調整函數5 RL調整函數6 根據結點的值、動態構造平衡二叉樹平衡二叉樹的構造過程 對一個查找問題而言&#xff0c;查找表的存儲結構、應該組織成二叉樹結構。而把一個…

[轉]定了!2020年,6種將死的編程語言!

隨著年度復工大戲的開播&#xff0c;編程界語言排行榜又要面臨一次全新的洗牌&#xff0c;六大編程語言將要黃了&#xff01;此消息一出&#xff0c;令眾多程序員心碎&#xff01;那么這將“亡”的六大語言中有你所擅長的嗎&#xff1f; Perl 曾幾何時&#xff0c;幾乎每個人都…

Java研發方向如何準備BAT技術面試答案(上)

http://blog.csdn.net/q979392157/article/details/52164319 阿里面試題總結 http://blog.csdn.net/q979392157/article/details/52173812 JAVA多線程和并發基礎 http://blog.csdn.net/q979392157/article/details/52104466 轉載于:https://www.cnblogs.com/Berryxiong/p/6…

正式發布丨AKS上的Dapr、ML、Gitops擴展

點擊上方藍字關注我們&#xff08;本文閱讀時間&#xff1a;5分鐘)我們很高興地宣布在 Azure Kubernetes? Service&#xff08;以下簡稱AKS&#xff09;上啟用的 Dapr、Azure 機器學習和 GitOps 三項新功能正式發布&#xff0c;可以通過稱為“集群擴展”的功能在 AKS 集群上啟…

【BZOJ3036】綠豆蛙的歸宿 概率DP

鏈接&#xff1a; #include <stdio.h> int main() {puts("轉載請注明出處[輾轉山河弋流歌 by 空灰冰魂]謝謝");puts("網址&#xff1a;blog.csdn.net/vmurder/article/details/46467217"); } 題解&#xff1a; 呃。拓撲圖上從后往前掃就好了Qwq 代碼…

C語言試題182之統計一串字符包含the的個數

??個人主頁:個人主頁 ??系列專欄:C語言試題200例 ??推薦一款刷算法、筆試、面經、拿大公司offer神器?? 點擊跳轉進入網站 ?作者簡介:大家好,我是碼莎拉蒂,CSDN博客專家(全站排名Top 50),阿里云博客專家、51CTO博客專家、華為云享專家 1、題目 題目: 統計一…

Mac上怎么把mov文件轉成gif文件

前言 在github上&#xff0c;我們發現很多開源庫的readme里都有gif文件&#xff0c;平時聊天我們也發現經常有些小伙伴發一些自制的gif文件。怎么把mov&#xff0c;MP4等其他格式的文件轉為gif文件呢&#xff1f;網上有很多介紹各種軟件的&#xff0c;大家可以隨便Google一下&a…

[轉]nginx反向代理網站(網易、百度之類的)

使用nginx反向代理百度之類的網站和反向代理自己發布的服務設置上有點差別&#xff0c;因為此差別費時良久&#xff0c;故記錄在此。 使用include 配置文件方式&#xff0c; 首先在 nginx.conf文件的 http 中 加入&#xff0c; include /etc/nginx/proxy34.conf;p…

【ArcGIS Pro微課1000例】0013:NOAA全球1km分辨率DEM下載及拼接教程(附已拼接成果下載地址)

文章目錄 一、全球1km分辨率DEM拼接成果介紹二、全球1km分辨率DEM原始數據下載三、全球1km分辨率DEM處理拼接流程四、全球1km分辨率DEM下載地址一、全球1km分辨率DEM拼接成果介紹 在ArcGIS Pro中加載拼接好的全球1km分辨率DEM數據集,如下圖所示: 三維顯示: 柵格源信息如下:…

國際主流產品信息管理規范SMBIOS支持LoongArch架構

SMBIOS支持龍架構&#xff08;LoongArch?&#xff09;龍芯生態標準統一近日&#xff0c;DMTF&#xff08;分布式管理任務組&#xff09;宣布SMBIOS規范支持龍架構&#xff08;LoongArch?&#xff09;&#xff0c;自此基于龍架構平臺開發的基礎硬件信息都將規范統一顯示&#…

Git 常用命令(二)

用 git init 在目錄中創建新的 Git 倉庫。 $ mkdir test $ cd test/ $ git init Initialized empty Git repository in /Users/chenm/www/test/.git/ # 在 /www/test/.git/ 目錄初始化空 Git 倉庫完畢。 可以看到在你的項目中生成了 .git 這個子目錄(隱藏文件)。 這就是你的 Gi…

【ArcGIS Pro微課1000例】0014:兩種坐標系全國1km分辨率DEM下載地址(WGS84+Albers投影)

本文提供兩種坐標系全國1km分辨率DEM下載地址(WGS84+Albers投影)。 文章目錄 全國1km分辨率DEM數據預覽WGS84地理坐標系Albers投影坐標系全國1km分辨率DEM數據下載全國1km分辨率DEM數據預覽 WGS84地理坐標系 三維顯示: 柵格信息:

AsyncTask的使用半解--!

AsyncTask,即異步任務,是Android給我們提供的一個處理異步任務的類.通過此類,可以實現UI線程和后臺線程進行通訊,后臺線程執行異步任務,并把結果返回給UI線程. .為什么需要使用異步任務? 我們知道,Android中只有UI線程,也就是主線程才能進行對UI的更新操作,而其他線程是不能直…

Andorid與webView交互,獲取webView選中文字,兼容了iframe

js調試效果&#xff1a; 下面主要是拼裝js代碼 &#xff1a; /** * Description 獲取webView選中文字內容 * param webView* param callBack*/public static void webViewGetSelectedData(WebView webView,webViewGetSelectedDataCallBack callBack) {String js "function…

C語言試題183之編寫一個程序,從標準的輸入讀取一些字符,并統計下各類字符所占的百分比

??個人主頁:個人主頁 ??系列專欄:C語言試題200例 ??推薦一款刷算法、筆試、面經、拿大公司offer神器?? 點擊跳轉進入網站 ?作者簡介:大家好,我是碼莎拉蒂,CSDN博客專家(全站排名Top 50),阿里云博客專家、51CTO博客專家、華為云享專家 1、題目 題目: 編寫一…