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消费掉了
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
· .NET 9 new features-C#13新的锁类型和语义
· Spring AI + Ollama 实现 deepseek-r1 的API服务和调用
· 《HelloGitHub》第 106 期
· 数据库服务器 SQL Server 版本升级公告
· 深入理解Mybatis分库分表执行原理
· 使用 Dify + LLM 构建精确任务处理应用