首页
视频
资源
登录
原
.netcore3.1 RabbitMq Routing的应用
3123
人阅读
2021/1/24 17:04
总访问:
2606112
评论:
0
收藏:
0
手机
分类:
RabbitMq
![](https://img.tnblog.net/arcimg/hb/585b0f1ffa7f4c2095baa20c175b32a0.png) >#.netcore3.1 RabbitMq Routing的应用 [TOC] tn>在前面很多文章中都用到了`routingKey`参数但并没有细说它的用途。在这之前我可以为大家举个栗子。 假如你开了一家水果商店,现在到了过节了为了加大买卖量需要对部分水果做打折处理,比如你要把`苹果`,`香蕉`,`橘子`都打七折,而`蓝莓`还是原来都价格。大致如下图所示: ![](https://img.tnblog.net/arcimg/hb/f2a71b90f3e9416a9597f1d0f26f127e.png) tn>上图的大致对应的如下表格所示,如果还看不懂看下图。 | 名称 | 对应的 | | ------------ | ------------ | | 水果 | routingKey | | 队列 | 很明显了 | | 篮子 | 消费端 | ![](https://img.tnblog.net/arcimg/hb/70a69a084de646c7b058aba171d2323e.png) tn>我相信大家都懂起了。下面开始写代码。 创建水果交换机,打折队列 ------------ >### 安装依赖包 ```bash dotnet add package RabbitMQ.Client --version 6.2.1 ``` >### 代码 ```csharp var factory = new ConnectionFactory() { HostName = "127.0.0.1", UserName = "bob", Password = "bob" }; // 创建一个链接 using (var connection = factory.CreateConnection()) { // 创建一个通道 using (var channel = connection.CreateModel()) { // 创建水果交换机 channel.ExchangeDeclare("FruitExchange", ExchangeType.Direct,true,false); // 声明一个七折队列 channel.QueueDeclare( queue: "SevenQueue", durable: true, exclusive: false, autoDelete: false, arguments: null); // 将七折队列与水果交换机绑定在一起 // 添加 苹果,香蕉,橘子 string[] fruits = new string[] { "apple", "banana", "orange" }; for (var i = 0; i < fruits.Length; i++) { channel.QueueBind("SevenQueue", "FruitExchange", fruits[i], null); } // 声明一个原价队列 channel.QueueDeclare( queue: "OriginalQueue", durable: true, exclusive: false, autoDelete: false, arguments: null); // 将原价队列与水果交换机绑定在一起 // 添加 蓝莓 string[] originalfruits = new string[] { "Blueberry" }; for (var i = 0; i < originalfruits.Length; i++) { channel.QueueBind("OriginalQueue", "FruitExchange", originalfruits[i], null); } Console.WriteLine("Finish"); Console.ReadLine(); } } ``` tn>我们在UI的交换机中查看`routingKey`绑定到队列的情况。 ![](https://img.tnblog.net/arcimg/hb/db28cd2aedfc463cb014e373e72598a7.png) 创建篮子(消费端)并进行消费 ------------ >### 命令创建消费篮子 ```bash dotnet new console -n BasketConsumer cd BasketConsumer dotnet add package RabbitMQ.Client --version 6.2.1 dotnet restore ``` ![](https://img.tnblog.net/arcimg/hb/01ac67f7a5a04bfa831aa36b34c11b13.png) >### 消费代码 ```csharp var factory = new ConnectionFactory() { HostName = "127.0.0.1", UserName = "bob", Password = "bob" }; // 获取篮子名称 var _BasketName = args[0]; // 创建一个链接 using (var connection = factory.CreateConnection()) { // 创建一个通道 using (var channel = connection.CreateModel()) { // one by one 处理 channel.BasicQos(prefetchSize: 0, prefetchCount: 1, global: false); // 创建消费实例 var consumer = new EventingBasicConsumer(channel); // 事件在交付到使用者时触发。(消费处理事件) consumer.Received += (model, ea) => { try { string BasketName = _BasketName; var body = ea.Body.ToArray(); var message = Encoding.UTF8.GetString(body); Thread.Sleep(1000); if (BasketName.ToLower() == "original") { Console.BackgroundColor = ConsoleColor.Blue; //设置背景色 Console.ForegroundColor = ConsoleColor.White; //设置前景色,即字体颜色 Console.WriteLine(" Original : {0}", message); // 手动确认 channel.BasicAck(deliveryTag: ea.DeliveryTag, multiple: false); } else { Console.BackgroundColor = ConsoleColor.Green; Console.ForegroundColor = ConsoleColor.DarkGreen; Console.WriteLine(" Seven : {0}", message); // 手动确认 channel.BasicAck(deliveryTag: ea.DeliveryTag, multiple: false); } } catch (Exception ex) { Console.WriteLine("【Error】:", ex.Message); } }; // 通过判断绑定到不同队列中去 if (_BasketName.ToLower() == "original") { channel.BasicConsume(queue: "OriginalQueue", autoAck: false, consumer: consumer); } else { channel.BasicConsume(queue: "SevenQueue", autoAck: false, consumer: consumer); } Console.ReadLine(); } } ``` >### 运行消费端 tn>在不同端窗口中运行该命令 ```csharp dotnet run seven dotnet run original ``` >### 添加消息 tn>修改部分创建交换机,队列端代码进行添加消息 ```csharp var factory = new ConnectionFactory() { HostName = "127.0.0.1", UserName = "bob", Password = "bob" }; // 创建一个链接 using (var connection = factory.CreateConnection()) { // 创建一个通道 using (var channel = connection.CreateModel()) { // 创建水果交换机 channel.ExchangeDeclare("FruitExchange", ExchangeType.Direct,true,false); // 声明一个七折队列 channel.QueueDeclare( queue: "SevenQueue", durable: true, exclusive: false, autoDelete: false, arguments: null); // 将七折队列与水果交换机绑定在一起 // 添加 苹果,香蕉,橘子 string[] fruits = new string[] { "apple", "banana", "orange" }; for (var i = 0; i < fruits.Length; i++) { channel.QueueBind("SevenQueue", "FruitExchange", fruits[i], null); } // 持久化操作,告诉Rabbitmq服务器将消息存储在磁盘上,但仍然有 // 少部分是存储在缓存中的,所以仍然不能绝对保证 var properties = channel.CreateBasicProperties(); properties.Persistent = true; // 发布一个苹果,香蕉,与橘子 channel.BasicPublish( exchange: "FruitExchange", routingKey: "apple", basicProperties: properties, body: Encoding.UTF8.GetBytes("Apple") ); channel.BasicPublish( exchange: "FruitExchange", routingKey: "banana", basicProperties: properties, body: Encoding.UTF8.GetBytes("Banana") ); channel.BasicPublish( exchange: "FruitExchange", routingKey: "orange", basicProperties: properties, body: Encoding.UTF8.GetBytes("Orange") ); // 声明一个原价队列 channel.QueueDeclare( queue: "OriginalQueue", durable: true, exclusive: false, autoDelete: false, arguments: null); // 将原价队列与水果交换机绑定在一起 // 添加 蓝莓 string[] originalfruits = new string[] { "Blueberry" }; for (var i = 0; i < originalfruits.Length; i++) { channel.QueueBind("OriginalQueue", "FruitExchange", originalfruits[i], null) } // 创建一个蓝莓水果到原价队列进行消费 channel.BasicPublish( exchange: "FruitExchange", routingKey: "Blueberry", basicProperties: properties, body: Encoding.UTF8.GetBytes("Blueberry") ); Console.WriteLine("Finish"); Console.ReadLine(); } } ``` >### 测试运行 ![](https://img.tnblog.net/arcimg/hb/07ce2175b6a04fa09c21fa087e1c8d56.png)
欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739
👈{{preArticle.title}}
👉{{nextArticle.title}}
评价
{{titleitem}}
{{titleitem}}
{{item.content}}
{{titleitem}}
{{titleitem}}
{{item.content}}
尘叶心繁
这一世以无限游戏为使命!
博主信息
排名
6
文章
6
粉丝
16
评论
8
文章类别
.net后台框架
168篇
linux
17篇
linux中cve
1篇
windows中cve
0篇
资源分享
10篇
Win32
3篇
前端
28篇
传说中的c
4篇
Xamarin
9篇
docker
15篇
容器编排
101篇
grpc
4篇
Go
15篇
yaml模板
1篇
理论
2篇
更多
Sqlserver
4篇
云产品
39篇
git
3篇
Unity
1篇
考证
2篇
RabbitMq
23篇
Harbor
1篇
Ansible
8篇
Jenkins
17篇
Vue
1篇
Ids4
18篇
istio
1篇
架构
2篇
网络
7篇
windbg
4篇
AI
18篇
threejs
2篇
人物
1篇
嵌入式
2篇
python
13篇
HuggingFace
8篇
pytorch
9篇
opencv
6篇
最新文章
最新评价
{{item.articleTitle}}
{{item.blogName}}
:
{{item.content}}
关于我们
ICP备案 :
渝ICP备18016597号-1
网站信息:
2018-2024
TNBLOG.NET
技术交流:
群号656732739
联系我们:
contact@tnblog.net
欢迎加群
欢迎加群交流技术