博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
RabbitMQ headers Exchange
阅读量:4551 次
发布时间:2019-06-08

本文共 2947 字,大约阅读时间需要 9 分钟。

 

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
() { {"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
{ //第一个匹配格式 ,第二与第三个则是匹配项 { "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消费掉了

转载于:https://www.cnblogs.com/zxtceq/p/7567370.html

你可能感兴趣的文章
Redis 笔记与总结4 set 和 zset 类型
查看>>
jQuery Ajax 回调函数中调用$(this)的问题 [ 转 ]
查看>>
thymeleaf:字符串拼接+输出单引号
查看>>
springboot:集成fastjson(教训)
查看>>
网络流 Edmons-Karp 算法讲解
查看>>
「NOIP2018模拟9.10」公约数 - 找规律 - gcd
查看>>
使用java理解程序逻辑(15)
查看>>
bzoj 1879 状压dp
查看>>
python 一些特殊用法和坑
查看>>
WIFI密码破解全攻略
查看>>
c++string各种函数
查看>>
errno.h含义
查看>>
字典树(模型体)
查看>>
盒模型详解
查看>>
bzoj2157 旅游
查看>>
bzoj5016 [Snoi2017]一个简单的询问
查看>>
poj2417 bzoj3239 Discrete Logging(bsgs)
查看>>
UVa10054 - The Necklace(欧拉回路【输出带来的麻烦)
查看>>
string和stringbuffer的区别 集合的作用 ArrayList vector linklist hashmap hashtable collection和collections...
查看>>
6月27日 ajax
查看>>