【微服务专题之】.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.mzph.cn/news/285016.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

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;几乎每个人都…

正式发布丨AKS上的Dapr、ML、Gitops扩展

点击上方蓝字关注我们&#xff08;本文阅读时间&#xff1a;5分钟)我们很高兴地宣布在 Azure Kubernetes  Service&#xff08;以下简称AKS&#xff09;上启用的 Dapr、Azure 机器学习和 GitOps 三项新功能正式发布&#xff0c;可以通过称为“集群扩展”的功能在 AKS 集群上启…

C语言试题182之统计一串字符包含the的个数

📃个人主页:个人主页 🔥系列专栏:C语言试题200例 💬推荐一款刷算法、笔试、面经、拿大公司offer神器👉 点击跳转进入网站 ✅作者简介:大家好,我是码莎拉蒂,CSDN博客专家(全站排名Top 50),阿里云博客专家、51CTO博客专家、华为云享专家 1、题目 题目: 统计一…

【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、题目 题目: 编写一…

【ArcGIS Pro微课1000例】0015:ArcGIS Pro中属性字段分式标注案例教程

文章目录 1. 符号化2. 属性字段分式标注在ArcGIS及Pro中很容易实现格式化标签的,本文讲解在ArcGIS Pro中实现属性字段分式标注,结果如下图所示: 1. 符号化 右键数据图层→符号系统,打开符号系统对话框,住符号系统选择【唯一值】,字段1选择NAME。 2. 属性字段分式标注 加…

C语言试题184之编写一个函数,从标准输入读取一个字符串,把字符串复制到动态内存分配的内存中,并返回该字符串的拷贝,这个函数不应该对读入字符串的长度作任何限制

📃个人主页:个人主页 🔥系列专栏:C语言试题200例 💬推荐一款刷算法、笔试、面经、拿大公司offer神器👉 点击跳转进入网站 ✅作者简介:大家好,我是码莎拉蒂,CSDN博客专家(全站排名Top 50),阿里云博客专家、51CTO博客专家、华为云享专家 1、题目 题目: 编写一…

[转]Linux面试题(2020最新版)

文章目录 Linux 概述 什么是LinuxUnix和Linux有什么区别&#xff1f;什么是 Linux 内核&#xff1f;Linux的基本组件是什么&#xff1f;Linux 的体系结构BASH和DOS之间的基本区别是什么&#xff1f;Linux 开机启动过程&#xff1f;Linux系统缺省的运行级别&#xff1f;Linux 使…

MSBuild 命令的简单使用

MSBuild 命令的简单使用独立观察员 2022 年 7 月 7 日位置在 VS 安装目录下&#xff0c;如&#xff1a;D:Microsoft Visual Studio2022EnterpriseMSBuildCurrentBin命令MSBuild 命令行参考 - MSBuild | Microsoft Docs&#xff08;https://docs.microsoft.com/zh-cn/visualstud…

ArcGIS实验教程——实验四十:ArcGIS洪水淹没分析案例教程

文章目录 一、洪水淹没效果动画演示二、实验数据三、实验过程1. 加载数据2. 符号化3. 夸大处理4. 动画制作5. 动画播放6. 导出动画基于数字高程模型 ( DEM )格网模型,实现给定水深情况下洪水淹没区的计算模型,讨论洪水淹没演进过程可视化实现的关键技术,以三维可视化方式,动…

C语言试题185之编写calloc函数,函数内部使用malloc函数来获取内存

📃个人主页:个人主页 🔥系列专栏:C语言试题200例 💬推荐一款刷算法、笔试、面经、拿大公司offer神器👉 点击跳转进入网站 ✅作者简介:大家好,我是码莎拉蒂,CSDN博客专家(全站排名Top 50),阿里云博客专家、51CTO博客专家、华为云享专家 1、题目 题目: 编写ca…

【ArcGIS遇上Python】ArcGIS Python按照指定字段批量筛选不同类型的图斑(以土地利用数据为例)

基于土地利用数据,根据用地类型名称,批量筛选出不同类型的用地,生成不同类型的shp数据,以类型名称命名。 文章目录 1. 土地利用原始数据2. 根据名称批量筛选结果3. ArcGIS Python批处理代码ArcGIS Python根据字段属性批量筛选生成shp图层 1. 土地利用原始数据 2. 根据名称批…

【转载】【面试题】你是一个测试工程师,如何保证软件质量?

2019独角兽企业重金招聘Python工程师标准>>> *参*答*案&#xff1a;质量是有层次&#xff08;内部质量&#xff0c;外部质量&#xff0c;使用质量&#xff0c;过程质量&#xff09; 内部质量&#xff1a;主要指代码的质量&#xff0c;就需要引入开发工程师进…