Headers Exchange

headers也是一种交换机类型,但是在rabbitmq官网中的教程中并没有说到。资料也很少,但是找一找总会有的。

headers与direct的模式不同,不是使用routingkey去做绑定。而是通过消息headers的键值对匹配

发布者  -- >  headersexchange  -->  (user:  “小明 ”) binding  --> queue

也就是说 user: 小明 替代了之前的routingkey。在做绑定的时候有两种匹配方式供选择。x-match (all/any)

意思就是键值对中所有的项都要匹配与只要有一个匹配就可以。下面就可以动手写代码了

在生产消息的时候,我们往消息的headers中附加了user:admin,pwd:123456

          //创建返回一个新的频道
using (var channel = RabbitMqHelper.GetConnection().CreateModel())
{ //创建properties
var properties = channel.CreateBasicProperties(); //往内容的headers中塞入值
properties.Headers = new Dictionary<string, object>()
{
{"user","admin" },
{"pwd","123456" }
}; //发布一个消息
var msg = Encoding.UTF8.GetBytes($"二狗子"); channel.BasicPublish("headersExchange", routingKey: string.Empty, basicProperties: properties,body: msg); Console.Write("发布成功!"); } Console.ReadKey();

在consumer中,我们可以选择创建两种方式,any/all。绑定的时候我们放了一些匹配项在里面,也就是如果 user:admin、pwd:123456 headers类型的exchange就可以把消息推到queue中

            bool flag = true;
string pattern = "";
while (flag)
{
Console.WriteLine("请选择headers匹配模式 1(any)/2(all)");
pattern = Console.ReadLine();
if (pattern == "1" || pattern == "2")
flag = false;
else
Console.Write("请做出正确的选择");
} using (var channel = RabbitMqHelper.GetConnection().CreateModel())
{
//根据声明使用的队列
var headersType = pattern == "1" ? "any" : "all"; //声明交换机 headers模式
channel.ExchangeDeclare("headersExchange", ExchangeType.Headers, true, false); channel.QueueDeclare("headersQueue", true, false, false, null);
//进行绑定
channel.QueueBind("headersQueue", "headersExchange", string.Empty, new Dictionary<string, object>
{
//第一个匹配格式 ,第二与第三个则是匹配项
{ "x-match",headersType},
{ "user","admin"},
{ "pwd","123456"}
}); //创建consumbers
var consumer = new EventingBasicConsumer(channel); consumer.Received += (sender, e) =>
{
var msg = Encoding.UTF8.GetString(e.Body); Console.WriteLine($"{msg}");
}; //进行消费
channel.BasicConsume("headersQueue", true, consumer); Console.ReadKey(); }

这里实验一个all类型的,首先把consumer运行起来,第一次我们的生产者的headers中只一个项匹配,可以看到消息是发布出去了,但是consumer并没有从queue中收到,也就是这边是不匹配的 exchange并没有把消息推到queue。

在webui中也是可以看到queue中是没有任何消息的

这时再把生产者的headers中user也加上,现在是完全匹配的再发布一次消息,发布的消息被consumer消费掉了

RabbitMQ headers Exchange的更多相关文章

  1. RabbitMQ Headers Exchange示例

    (1).发布者 var connectionFactory = new ConnectionFactory() { HostName="192.168.205.128",UserN ...

  2. RabbitMQ学习之:(九)Headers Exchange (转贴+我的评论)

    From: http://lostechies.com/derekgreer/2012/05/29/rabbitmq-for-windows-headers-exchanges/ RabbitMQ f ...

  3. RabbitMQ系列(三)RabbitMQ交换器Exchange介绍与实践

    RabbitMQ交换器Exchange介绍与实践 RabbitMQ系列文章 RabbitMQ在Ubuntu上的环境搭建 深入了解RabbitMQ工作原理及简单使用 RabbitMQ交换器Exchang ...

  4. Rabbitmq交换器Exchange和消息队列

    通常我们谈到队列服务, 会有三个概念: 发消息者.队列.收消息者,RabbitMQ 在这个基本概念之上, 多做了一层抽象, 在发消息者和 队列之间, 加入了交换器 (Exchange). 这样发消息者 ...

  5. RabbitMQ交换器Exchange介绍与实践

    RabbitMQ交换器Exchange介绍与实践 RabbitMQ系列文章 RabbitMQ在Ubuntu上的环境搭建 深入了解RabbitMQ工作原理及简单使用 RabbitMQ交换器Exchang ...

  6. RabbitMQ(Exchange交换机详解)(四)

    Exchange:接收消息,并根据路由键转发消息所绑定的队列 ClientA,B将消息投递到交换机Exchange上,通过路由关系,投递到指定的queue1或者queue2上,通过监听投递到Clien ...

  7. RabbitMQ之Exchange

    交换机的作用: 生产者发送消息不会向传统方式直接将消息投递到队列中,而是先将消息投递到交换机中,在由交换机转发到具体的队列,队列在将消息以推送或者拉取方式给消费者进行消费,这和我们之前学习Nginx有 ...

  8. RabbitMQ通过Exchange.headers属性代替routekey,x-match实现队列精准匹配

    消费者: static void Main(string[] args) { ConnectionFactory factory = new ConnectionFactory() { HostNam ...

  9. RabbitMQ中 exchange、route、queue的关系

    从AMQP协议可以看出,MessageQueue.Exchange和Binding构成了AMQP协议的核心,下面我们就围绕这三个主要组件    从应用使用的角度全面的介绍如何利用Rabbit MQ构建 ...

随机推荐

  1. Windows驱动——虚拟机 虚拟串口 双机调试

    =================================版权声明================================= 版权声明:原创文章 谢绝转载  请通过右侧公告中的“联系邮 ...

  2. .net core 用grpc实现微服务

    GRPC 是Google发布的一个开源.高性能.通用RPC(Remote Procedure Call)框架.提供跨语言.跨平台支持.以下以.NET Core 使用控制台.docker中演示如何使用G ...

  3. 微信开放平台开发——网页微信扫码登录(OAuth2.0)

    1.OAuth2.0 OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用. 允许用户提供 ...

  4. windows 2012 r2下安装sharepoint 2013错误解决

    日前,我在安装sharepoint 2013时,需要预部署一些软件,我们知道运行产品准备工具“prerequisiteinstaller”后就可以自动下载安装配置这些软件,但是使用系统为windows ...

  5. Linux 下编译openjdk

    操作系统ubuntu14.04 openjdk版本 7u4 openjdk7u4可以在https://jdk7.java.net/source.html下载   一.构建编译环境 sudo apt-g ...

  6. Centos允许root远程登录设置

      以root权限执行 vi /etc/ssh/sshd_config 将 #PermitRootLogin yes 这一行的“#”去掉,修改为: PermitRootLogin yes 重启ssh服 ...

  7. 【转】SVN提交一般原则

    写在前面: 最近, 跳槽了. 来到了一家感觉QIAN景不错的创业公司. 由于是开始, 规模比较小, SVN的管理工作, 也有我来承担. 今天发生了一些相当不愉快的事情, 就是因为一个同事, ①签入代码 ...

  8. Windows10 会不会成为微软的新起点?

    Because if you change the way you see the world, you can change the world you see. 如果你改变看世界的方式,你就能改变 ...

  9. Android项目部署时,发生AndroidRuntime:android.view.InflateException: Binary XML file line #168: Error inflating class错误

    这个错误也是让我纠结了一天,当时写的项目在安卓虚拟机上运行都很正常,于是当我部署到安卓手机上时,点击登陆按钮跳转到用户主界面的时候直接结束运行返回登陆界面.    当时,我仔细检查了一下自己的代码,并 ...

  10. 理解 OpenStack 高可用(HA)(1):OpenStack 高可用和灾备方案 [OpenStack HA and DR]

    本系列会分析OpenStack 的高可用性(HA)概念和解决方案: (1)OpenStack 高可用方案概述 (2)Neutron L3 Agent HA - VRRP (虚拟路由冗余协议) (3)N ...