RabbitMQ headers Exchange
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的更多相关文章
- RabbitMQ Headers Exchange示例
(1).发布者 var connectionFactory = new ConnectionFactory() { HostName="192.168.205.128",UserN ...
- RabbitMQ学习之:(九)Headers Exchange (转贴+我的评论)
From: http://lostechies.com/derekgreer/2012/05/29/rabbitmq-for-windows-headers-exchanges/ RabbitMQ f ...
- RabbitMQ系列(三)RabbitMQ交换器Exchange介绍与实践
RabbitMQ交换器Exchange介绍与实践 RabbitMQ系列文章 RabbitMQ在Ubuntu上的环境搭建 深入了解RabbitMQ工作原理及简单使用 RabbitMQ交换器Exchang ...
- Rabbitmq交换器Exchange和消息队列
通常我们谈到队列服务, 会有三个概念: 发消息者.队列.收消息者,RabbitMQ 在这个基本概念之上, 多做了一层抽象, 在发消息者和 队列之间, 加入了交换器 (Exchange). 这样发消息者 ...
- RabbitMQ交换器Exchange介绍与实践
RabbitMQ交换器Exchange介绍与实践 RabbitMQ系列文章 RabbitMQ在Ubuntu上的环境搭建 深入了解RabbitMQ工作原理及简单使用 RabbitMQ交换器Exchang ...
- RabbitMQ(Exchange交换机详解)(四)
Exchange:接收消息,并根据路由键转发消息所绑定的队列 ClientA,B将消息投递到交换机Exchange上,通过路由关系,投递到指定的queue1或者queue2上,通过监听投递到Clien ...
- RabbitMQ之Exchange
交换机的作用: 生产者发送消息不会向传统方式直接将消息投递到队列中,而是先将消息投递到交换机中,在由交换机转发到具体的队列,队列在将消息以推送或者拉取方式给消费者进行消费,这和我们之前学习Nginx有 ...
- RabbitMQ通过Exchange.headers属性代替routekey,x-match实现队列精准匹配
消费者: static void Main(string[] args) { ConnectionFactory factory = new ConnectionFactory() { HostNam ...
- RabbitMQ中 exchange、route、queue的关系
从AMQP协议可以看出,MessageQueue.Exchange和Binding构成了AMQP协议的核心,下面我们就围绕这三个主要组件 从应用使用的角度全面的介绍如何利用Rabbit MQ构建 ...
随机推荐
- Windows on Device 项目实践 5 - 姿态控制灯制作
在前面几篇文章中,我们学习了如何利用Intel Galileo开发板和Windows on Device来设计并完成PWM调光灯.感光灯.火焰报警器和智能风扇的制作,涉及到了火焰传感器.DC直流电机. ...
- SQL SERVER 2008:内部查询处理器错误: 查询处理器在执行过程中遇到意外错误
今天一个同事突然告诉我,以前跑得很正常的一个SQL语句,执行时突然报如下错误: 消息1222,级别16,状态18,第1 行 已超过了锁请求超时时段. ...
- 使用multi-paxos实现日志同步应用
paxos 说multi-paxos之前先简要说一下paxos paxos是在多个成员之间对某个值(提议)达成一致的一致性协议.这个值可以是任何东西.比如多个成员之间进行选主,那么这个值就是主的身份. ...
- 问题解决——CVSListBox的使用
=================================版权声明================================= 版权声明:本文为博主原创文章 未经许可不得转载 请通过右 ...
- SQL*LOADER错误总结
在使用SQL*LOADER装载数据时,由于平面文件的多样化和数据格式问题总会遇到形形色色的一些小问题,下面是工作中累积.整理记录的遇到的一些形形色色错误.希望能对大家有些用处.(今天突然看到自己以前整 ...
- FFMPEG在嵌入式硬件上应用之 —— 基本环境搭建及编译
前段时间在翻看电脑里面资料时,发现了以前做的在嵌入式硬件上面运行以ffmepg为基础,以嵌入式硬件解码的多媒体播放工作,发现都快忘记完了.今日得闲整理温习了一下ffmpeg在嵌入式上的运用,这里给大家 ...
- insertion sort(插入排序)
#include<stdio.h> #include<time.h> int insertion_sort() { ; int a[max],i,j; srand((unsig ...
- 报表移动端app如何实现页面自适应?
1. 描述 PC上制作好的报表,在手机端查看的时候,报表软件默认的自适应效果不尽人如意.例如,报表比较大,到手机上被缩的非常小,字都看不清等等.为此FineReport增加了选项可以手动控制报表在移动 ...
- faster_rcnn c++版本的 caffe 封装(1)
转载请注明出处,楼燚(yì)航的blog,http://www.cnblogs.com/louyihang-loves-baiyan/ 由于需要把FasterRCNN做的工程化,因此这里需要对Caff ...
- iOS状态栏---学习笔记六
一.设置状态栏的颜色. //1.需要在自定义导航的时候,设置顶部视图 - (UIViewController *)childViewControllerForStatusBarStyle{ retur ...