消费者:

 static void Main(string[] args)
{
ConnectionFactory factory = new ConnectionFactory()
{
HostName = "192.168.254.40",
UserName = "admin",
Password = "admin",
}; //第一步:创建connection
var connection = factory.CreateConnection(); //第二步:创建一个channel
var channel = connection.CreateModel(); //第三步:申明交换机【因为rabbitmq已经有了自定义的ampq default exchange】
channel.ExchangeDeclare("myheadersexchange", ExchangeType.Headers, true, false, null); //第四步:创建一个队列(queue)
channel.QueueDeclare("myheadersqueue", true, false, false, null); //将queue绑定到exchange之上。。。。
channel.QueueBind("myheadersqueue", "myheadersexchange", string.Empty, new Dictionary<string, object>()
{
{"x-match", "all"},
{"username", "jack"},
{"password", "" }
}); EventingBasicConsumer consumer = new EventingBasicConsumer(channel); consumer.Received += (sender, e) =>
{
var msg = Encoding.UTF8.GetString(e.Body); Console.WriteLine(msg);
}; channel.BasicConsume("myheadersqueue", true, consumer); Console.WriteLine("consumer1 端启动完毕!!!"); Console.Read();
}

生产者:

static void Main(string[] args)
{
ConnectionFactory factory = new ConnectionFactory()
{
HostName = "192.168.254.40",
UserName = "admin",
Password = "admin",
}; //第一步:创建connection
var connection = factory.CreateConnection(); //第二步:创建一个channel
var channel = connection.CreateModel(); var properties = channel.CreateBasicProperties(); properties.Headers = new Dictionary<string, object>(); properties.Headers.Add("password", "");
properties.Headers.Add("username", "jack"); for (int i = ; i < ; i++)
{
var msg = Encoding.UTF8.GetBytes(string.Format("{0} :{1}", i, "你好")); //第五步:发布消息
channel.BasicPublish("myheadersexchange", routingKey: string.Empty, basicProperties: properties, body: msg); Console.WriteLine(i);
}
}

headers 是采用多个属性代替routing key

x-match [all/any] all: 所有的header头信息必须匹配。。。

any: 只要有一个匹配就ok了。。。。

direct exchange: 只需要匹配一个routingkey就可以了。。。。

而现在的headers匹配,必须是满足一个或者全部的条件。。。 【and /or】的关系。。。

if(name=="jack" || age==20){
queue1.add(msg);
}

if(name=="jack" && age==20){
queue2.add(msg);
}

在webui上看一下:

x-match: any

x-match:all

key,value的顺序没有特别大的关系,因为headers.erl中会将这些key按照字母进行排序。。。

RabbitMQ通过Exchange.headers属性代替routekey,x-match实现队列精准匹配的更多相关文章

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

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

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

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

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

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

  4. RabbitMQ原理——exchange、route、queue的关系

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

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

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

  6. (转)RabbitMQ学习之Headers交换类型(java)

    http://blog.csdn.net/zhu_tianwei/article/details/40923131 Headers类型的exchange使用的比较少,它也是忽略routingKey的一 ...

  7. .NET Core RabbitMQ探索(2)——RabbitMQ的Exchange

    实际上,RabbitMQ的生产者并不会直接把消息发送给队列,甚至生产者都不知道消息是否会被发送给一个队列.对于生产者而言,它们只能把消息发送到Exchange,一个Exchange所完成的工作相当简单 ...

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

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

  9. 通过springmvc的RequestMapping的headers属性的使用

    直接上图: springmvc中可以通过@RequestMapping注解折配置headers属性,也就是通过headers属性来配置请求头信息,从而通过这个属性值来映射请求,因为不同浏览器的Acce ...

随机推荐

  1. JDK源码分析(8) StringBuffer & StringBuilder

    简介 StringBuffer与StringBuilder是两个常用的操作字符串的类.大家都知道,StringBuilder是线程不安全的,而StringBuffer是线程安全的.前者是JDK1.5加 ...

  2. LeetCode--11_974_Subarray_Sums_Divisible_by_K

    题目链接:点击这里 public static int subarraysDivByK(int[] A, int K) { int ans = 0,sum = 0; int[] B = new int ...

  3. ReactNative开发笔记(持续更新...)

    本文均为RN开发过程中遇到的问题.坑点的分析及解决方案,各问题点之间无关联,希望能帮助读者少走弯路,持续更新中... (2019年3月29日更新) 原文链接:http://www.kovli.com/ ...

  4. MySql实现远程访问配置

    1.新建用户远程连接mysql数据库grant all on *.* to admin@'%' identified by '123456' with grant option; flush priv ...

  5. 移动开发day4_京东移动页面

    复习 父项身上有哪些属性 可以设置 主轴方向 fd flex-direction : row; column; 主轴子项的排列方式 j justify-content: flex-start;flex ...

  6. MYCP作业

    本次作业主要复习了输入流输出流的内容 作业要求: 编写MyCP.java 实现类似Linux下cp XXX1 XXX2的功能,要求MyCP支持两个参数: java MyCP -tx XXX1.txt ...

  7. springboot 共享session

    1.pom添加jar依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifact ...

  8. ASP.NET MVC - Entity Framework

    ASP.NET MVC - Entity Framework 实体关系 关系是某个实体(表)的一条记录对应于另一个实体(表)的一条或多条记录. 一对多关系 单方面的包含关系称为一对多,而一对多和一对一 ...

  9. Linux 技巧:让进程在后台可靠运行的几种方法【转】

    我们经常会碰到这样的问题,用 telnet/ssh 登录了远程的 Linux 服务器,运行了一些耗时较长的任务, 结果却由于网络的不稳定导致任务中途失败.如何让命令提交后不受本地关闭终端窗口/网络断开 ...

  10. django 模型models

    1. django 模型models 常用字段          1.models.AutoField 自增列 = int(11) 如果没有的话,默认会生成一个名称为 id 的列 如果要显式的自定义一 ...