tnblog
首页
视频
资源
登录

.netcore3.1 RabbitMq Header交换机

5419人阅读 2021/1/27 11:22 总访问:3465176 评论:0 收藏:0 手机
分类: RabbitMq

.netcore3.1 RabbitMq Header交换机

标头交换机指在用于在多个属性上路由,这些属性比路由键更容易表示为消息标头。标头交换忽略路由键属性。相反,用于路由的属性取自headers属性。如果标头的值等于绑定时指定的值,则认为消息匹配。
可以使用多个标题进行匹配,将队列绑定到标题交换。在这种情况下,代理需要从应用程序开发人员那里获得另一条信息,即,它是否应该考虑具有任何匹配的标头或全部匹配的消息?这就是x-match绑定参数的作用。当x-match参数设置为any时,仅一个匹配的标头值就足够了。或者,将x-match设置为all要求所有值必须匹配。

其实这个玩意比较像我们在编程中的andall的关系,简单来看可以如下面这张图所示。

创建Header交换机与队列

注意这里的routingKey其实并不起到任何作用所以这里我们可以将它设置为空,我们通过上图所示创建一个Header交换机,并先创建x-match:any的队列myheaderQueue1

  1. var factory = new ConnectionFactory()
  2. {
  3. HostName = "47.98.187.188",
  4. UserName = "bob",
  5. Password = "bob"
  6. };
  7. // 创建一个链接
  8. using (var connection = factory.CreateConnection())
  9. {
  10. // 创建一个通道
  11. using (var channel = connection.CreateModel())
  12. {
  13. // 创建Header类型的交换机
  14. channel.ExchangeDeclare(exchange: "MyHeaderExchange", ExchangeType.Headers, true, false);
  15. // 声明一个队列
  16. channel.QueueDeclare(
  17. queue: "myheaderQueue1",
  18. durable: true,
  19. exclusive: false,
  20. autoDelete: false,
  21. arguments: null);
  22. // 绑定相关参数并将x-match设置为any
  23. channel.QueueBind("myheaderQueue1", "MyHeaderExchange",string.Empty,new Dictionary<string, object> {
  24. { "x-match","any" },
  25. { "name","aidasi" },
  26. { "age","18" }
  27. });
  28. Console.WriteLine("myheaderQueue1 Created!");
  29. }
  30. }

随后我们再创建x-match:allmyheaderQueue1队列。

  1. var factory = new ConnectionFactory()
  2. {
  3. HostName = "47.98.187.188",
  4. UserName = "bob",
  5. Password = "bob"
  6. };
  7. // 创建一个链接
  8. using (var connection = factory.CreateConnection())
  9. {
  10. // 创建一个通道
  11. using (var channel = connection.CreateModel())
  12. {
  13. // 创建Header类型的交换机
  14. channel.ExchangeDeclare(exchange: "MyHeaderExchange", ExchangeType.Headers, true, false);
  15. // 声明一个队列
  16. channel.QueueDeclare(
  17. queue: "myheaderQueue2",
  18. durable: true,
  19. exclusive: false,
  20. autoDelete: false,
  21. arguments: null);
  22. // 绑定相关参数并将x-match设置为any
  23. channel.QueueBind("myheaderQueue2", "MyHeaderExchange",string.Empty,new Dictionary<string, object> {
  24. { "x-match","all" },
  25. { "name","aidasi" },
  26. { "age","18" }
  27. });
  28. Console.WriteLine("myheaderQueue1 Created!");
  29. }
  30. }

运行并在UI上查看绑定情况。

发布消息

发布3条消息。代码如下:

  1. var factory = new ConnectionFactory()
  2. {
  3. HostName = "47.98.187.188",
  4. UserName = "bob",
  5. Password = "bob"
  6. };
  7. // 创建一个链接
  8. using (var connection = factory.CreateConnection())
  9. {
  10. // 创建一个通道
  11. using (var channel = connection.CreateModel())
  12. {
  13. var properties = channel.CreateBasicProperties();
  14. // 消息持久化
  15. properties.Persistent = true;
  16. // 实例化消息投
  17. // 创建any的队列
  18. properties.Headers = new Dictionary<string, object>()
  19. {
  20. { "name","aidasi" },
  21. { "age","18" }
  22. };
  23. var msg = Encoding.UTF8.GetBytes("Message: name-aidasi,age-18");
  24. channel.BasicPublish("MyHeaderExchange", string.Empty, properties, msg);
  25. properties.Headers = new Dictionary<string, object>()
  26. {
  27. { "name","aidasi" }
  28. };
  29. var msg1 = Encoding.UTF8.GetBytes("Message: name-aidasi");
  30. channel.BasicPublish("MyHeaderExchange", string.Empty, properties, msg1);
  31. properties.Headers = new Dictionary<string, object>()
  32. {
  33. { "name","bob" },
  34. { "age","19" }
  35. };
  36. var msg2 = Encoding.UTF8.GetBytes("Message: name-bob,age-19");
  37. channel.BasicPublish("MyHeaderExchange", string.Empty, properties, msg2);
  38. }
  39. }

UI中我们发现有相应的消息进入到了队列中

消费消息

代码如下:

  1. var factory = new ConnectionFactory()
  2. {
  3. HostName = "47.98.187.188",
  4. UserName = "bob",
  5. Password = "bob"
  6. };
  7. Console.WriteLine("Please enter a queue name:");
  8. // MyTopicExchange1 MyTopicExchange2
  9. string queuename = Console.ReadLine();
  10. // 创建一个链接
  11. using (var connection = factory.CreateConnection())
  12. {
  13. // 创建一个通道
  14. using (var channel = connection.CreateModel())
  15. {
  16. // 创建消费实例
  17. var consumer = new EventingBasicConsumer(channel);
  18. // 事件在交付到使用者时触发。(消费处理事件)
  19. consumer.Received += (model, ea) =>
  20. {
  21. string EventQueueName = queuename;
  22. var body = ea.Body.ToArray();
  23. var message = Encoding.UTF8.GetString(body);
  24. Console.WriteLine($" Queue:{EventQueueName} Message: {message}");
  25. // 手动确认
  26. channel.BasicAck(deliveryTag: ea.DeliveryTag, multiple: true);
  27. };
  28. // 绑定到队列中去
  29. channel.BasicConsume(queue: queuename, autoAck: false, consumer: consumer);
  30. Console.ReadLine();
  31. }
  32. }

我们找到程序生成后的目录,并运行两个Bash到两个Header队列中进行消费消息。

我们发现处理bob那条消息没有消费外,其他的消息都对应了相应的orand进行消费


欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739

评价

rabbitmq官网上六大版块之二(Direct类型交换机通过routingKey分类型输出)

其实rabbitmq,老师都说得差不多了,下面是老师的连接。http://www.tnblog.net/aojiancc2/article/UserCategory/134官网教...

rabbitmq六大版块之三(Fanout类型交换机相同数据多逼格处理)

Fanout类型交换机的特点是:同样的数据分发给每一个自己所绑定的队列,每个队列可以按照自己的需求对数据进行不同的处理【...

rabbitmq中Header类型交换机的处理(and与or的处理)

headers类型交换机是通过 muliple attributes 代替 routing key.x-match [all/any]all: 所有地方header头信息必须匹配any:...

mq交换机的各种类型

《1》Message TTL (1) Queue TTL =》 给队列中的所有消息限定一个时间 (2) Message TTL =》 给队列中指定的消息限定一个时...

.netcore3.1 RabbitMq Fanout交换机

.netcore3.1 RabbitMq Fanout交换机[TOC] 在前面我们有提到交换机但都是用的普通的交换机(direct),交换机在Rabbitmq中有...

.netcore3.1 RabbitMq Topics交换机

.netcore3.1 RabbitMq Topics交换机[TOC] Topic Exchange介绍 发送到topic交换机的消息不能具有任意的 routing_key -它必...

路由器与交换机的概念和区别

前言:各位看官老爷,大家早上好 俺是小付童鞋 今天和大家浅谈一下路由和交换机之间的连续。如有讲解错误的地方还请各位大佬...

net core 使用 EF Code First

下面这些内容很老了看这篇:https://www.tnblog.net/aojiancc2/article/details/5365 项目使用多层,把数据库访问...

.net mvc分部页,.net core分部页

.net分部页的三种方式第一种:@Html.Partial(&quot;_分部页&quot;)第二种:@{ Html.RenderPartial(&quot;分部页&quot;);}...

StackExchange.Redis操作redis(net core支持)

官方git开源地址https://github.com/StackExchange/StackExchange.Redis官方文档在docs里边都是官方的文档通过nuget命令下...

.net core 使用session

tip:net core 2.2后可以直接启用session了,不用在自己添加一次session依赖,本身就添加了使用nuget添加引用Microsoft.AspN...

通俗易懂,什么是.net?什么是.net Framework?什么是.net core?

朋友圈@蓝羽 看到一篇文章写的太详细太通俗了,搬过来细细看完,保证你对.NET有个新的认识理解原文地址:https://www.cnblo...

asp.net core2.0 依赖注入 AddTransient与AddScoped的区别

asp.net core主要提供了三种依赖注入的方式其中AddTransient与AddSingleton比较好区别AddTransient瞬时模式:每次都获取一...

.net core 使用 Kestrel

Kestrel介绍 Kestrel是一个基于libuv的跨平台web服务器 在.net core项目中就可以不一定要发布在iis下面了Kestrel体验可以使...

net core中使用cookie

net core中可以使用传统的cookie也可以使用加密的cookieNET CORE中使用传统cookie设置:HttpContext.Response.Cookies.Appe...
这一世以无限游戏为使命!
排名
2
文章
633
粉丝
44
评论
93
docker中Sware集群与service
尘叶心繁 : 想学呀!我教你呀
一个bug让程序员走上法庭 索赔金额达400亿日元
叼着奶瓶逛酒吧 : 所以说做程序员也要懂点法律知识
.net core 塑形资源
剑轩 : 收藏收藏
映射AutoMapper
剑轩 : 好是好,这个对效率影响大不大哇,效率高不高
ASP.NET Core 服务注册生命周期
剑轩 : http://www.tnblog.net/aojiancc2/article/details/167
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术