headers exchange是根据消息header值而不是routing key将消息路由到队列的交换器。

生产者在消息头中以键值对的形式添加一些值,并将其发送到headers exchange,

收到消息后,headers exchange尝试将所有或任何(基于x-match的值)header值与绑定到它的所有队列的值匹配。 如果找到匹配,则将消息路由到绑定值匹配的队列,如果未找到匹配,则忽略该消息

1. 完整示例代码
  • 编写HeaderExchangeConfig.java配置文件,已声明headers exchange及其绑定
@Configuration
public class HeaderExchangeConfig { @Bean
public HeadersExchange headers() {
return new HeadersExchange("headers");
} private static class ConsumerConfig { @Bean
public Queue headersAutoDeleteQueue1() {
return new AnonymousQueue();
} @Bean
public Queue headersAutoDeleteQueue2() {
return new AnonymousQueue();
} @Bean
public Queue headersAutoDeleteQueue3() {
return new AnonymousQueue();
} @Bean
public Binding headersBinding1(HeadersExchange headers, Queue headersAutoDeleteQueue1) {
Map<String, Object> headerMap = new HashMap<>();
headerMap.put("h1", "Header1");
headerMap.put("h2", "Header2");
/**
* 匹配到任意一个就发送至队列
*/
return BindingBuilder.bind(headersAutoDeleteQueue1).to(headers).whereAny(headerMap).match();
} @Bean
public Binding headersBinding2(HeadersExchange headers, Queue headersAutoDeleteQueue2) {
Map<String, Object> headerMap = new HashMap<>();
headerMap.put("h1", "Header1");
headerMap.put("h2", "Header2");
/**
* 全部匹配到才会发送至队列
*/
return BindingBuilder.bind(headersAutoDeleteQueue2).to(headers).whereAll(headerMap).match();
} @Bean
public Binding headersBinding3(HeadersExchange headers, Queue headersAutoDeleteQueue3) {
/**
* 匹配到任意一个就发送至队列, 此处与headersBinding1一致,为了证明其也有fanout模式的功能
*/
Map<String, Object> headerMap = new HashMap<>();
headerMap.put("h1", "Header1");
headerMap.put("h2", "Header2");
return BindingBuilder.bind(headersAutoDeleteQueue3).to(headers).whereAny(headerMap).match();
}
}
}
  • 编写生产者
@Component
public class HeaderSender { private RabbitMessagingTemplate rabbitMessagingTemplate; public HeaderSender(RabbitMessagingTemplate rabbitMessagingTemplate) {
this.rabbitMessagingTemplate = rabbitMessagingTemplate;
} public void send() {
String msg = "Hello World!";
Map<String, Object> headerMap = new HashMap<>();
headerMap.put("h1", "Header1");
headerMap.put("h3", "Header3");
rabbitMessagingTemplate.convertAndSend("headers", "", msg, headerMap); msg = "My Girl!";
headerMap.clear();
headerMap.put("h1", "Header1");
headerMap.put("h2", "Header2");
rabbitMessagingTemplate.convertAndSend("headers", "", msg, headerMap);
}
}
  • 编写消费者
@Component
public class HeaderReceiver { @RabbitListener(queues = "#{headersAutoDeleteQueue1.name}")
public void receive1(String in) {
System.out.println("临时队列1接收到消息:" + in);
} @RabbitListener(queues = "#{headersAutoDeleteQueue2.name}")
public void receive2(String in) {
System.out.println("临时队列2接收到消息:" + in);
} @RabbitListener(queues = "#{headersAutoDeleteQueue3.name}")
public void receive3(String in) {
System.out.println("临时队列3接收到消息:" + in);
}
}
  • 编写测试方法
@SpringBootTest
public class RabbitTest {
@Autowired
private HeaderSender headerSender; @Test
public void testHeaderSender() {
headerSender.send();
}
}

从结果中不难看出,My Girl消息3个队列都匹配到headers, 而Hello Word消息只有队列1与3匹配到,毕竟他没有h2头啦

欢迎关注公众号算法小生沈健的技术博客

5.RabbitMQ系列之headers交换器的更多相关文章

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

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

  2. 【RabbitMQ系列】队列、绑定、交换器

    队列: 从概念上来讲,AMQP消息路由必须有三部分:交换器.队列和绑定.生产者把消息发布到交换器上:消息最终到达队列,并被消费者接收:绑定决定了消息如何从路由器路由到特定的队列. 消费者通过以下两种方 ...

  3. RabbitMQ系列(二)深入了解RabbitMQ工作原理及简单使用

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

  4. RabbitMQ系列(四)RabbitMQ事务和Confirm发送方消息确认——深入解读

    RabbitMQ事务和Confirm发送方消息确认--深入解读 RabbitMQ系列文章 RabbitMQ在Ubuntu上的环境搭建 深入了解RabbitMQ工作原理及简单使用 RabbitMQ交换器 ...

  5. RabbitMQ系列教程之七:RabbitMQ的 C# 客户端 API 的简介(转载)

    RabbitMQ系列教程之七:RabbitMQ的 C# 客户端 API 的简介 今天这篇博文是我翻译的RabbitMQ的最后一篇文章了,介绍一下RabbitMQ的C#开发的接口.好了,言归正传吧. N ...

  6. RabbitMQ系列教程之三:发布/订阅(Publish/Subscribe)(转载)

    RabbitMQ系列教程之三:发布/订阅(Publish/Subscribe) (本教程是使用Net客户端,也就是针对微软技术平台的) 在前一个教程中,我们创建了一个工作队列.工作队列背后的假设是每个 ...

  7. 在Node.js中使用RabbitMQ系列二 任务队列

    在上一篇文章在Node.js中使用RabbitMQ系列一 Hello world我有使用一个任务队列,不过当时的场景是将消息发送给一个消费者,本篇文章我将讨论有多个消费者的场景. 其实,任务队列最核心 ...

  8. RabbitMQ系列教程之六:远程过程调用(RPC)(转载)

    RabbitMQ系列教程之六:远程过程调用(RPC) 远程过程调用(Remote Proceddure call[RPC]) (本实例都是使用的Net的客户端,使用C#编写) 在第二个教程中,我们学习 ...

  9. RabbitMQ系列教程之五:主题(Topic)(转载)

    RabbitMQ系列教程之五:主题(Topic) (本实例都是使用的Net的客户端,使用C#编写),说明,中文方括号[]表示名词. 在上一个教程中,我们改进了我们的日志记录系统. 没有使用只能够进行虚 ...

随机推荐

  1. Nginx 限制上传文件的大小。responded with a status of 413 (Request Entity Too Large)

    # 限制请求体的大小,若超过所设定的大小,返回413错误. client_max_body_size 50m; # 读取请求头的超时时间,若超过所设定的大小,返回408错误. client_heade ...

  2. Python小游戏——外星人入侵(保姆级教程)第一章 06让飞船移动

    系列文章目录 第一章:武装飞船 06:让飞船移动 一.驾驶飞船 下面来让玩家能够左右移动飞船.我们将编写代码,在用户按左或右箭头键时做出响应.我们将首先专注于向右移动,再使用同样的原理来控制向左移动. ...

  3. 微信小程序/校园社区论坛/微信云开发/云函数

    一.框架来源 1.非常非常感谢B站up主"梦千的曾哥哥"的开源框架. 没有他就没有这个小程序.如果有想做的同学,可以直接移步他的视频那里开始学习.我水平不够,就不教具体怎么配置环境 ...

  4. MongoDB,入门看这一篇足矣!

    一.介绍 在介绍 MongoDB 之前,我先介绍一下业务开发的时候遇到的痛点,以便大家对它有一个更加清晰的认识! 最近在用数据库存储数据的时候发现这么一个坑,例如从消息队列中监听消息的时候,原来的做法 ...

  5. Swift中的Result 类型的简单介绍

    Swift 5引入了一个新的Result类型, 它使用枚举来处理异步函数的结果. 苹果文档对该类型的描述: A value that represents either a success or a ...

  6. RT-Thread Studio增加软件包操作

    RT-Thread Studio增加软件包操作 1. 在本地中完成如下操作 打开RTthread Studio的安装目录 在当前目录下找到env的目录 在env的目录下找到要添加软件包的分类文件夹 本 ...

  7. KingbaseES R6 集群sys_monitor.sh change_password一键修改集群用户密码

    案例说明: kingbaseES R6集群用户密码修改,需要修改两处: 1)修改数据库用户密码(alter user): 2)修改.encpwd文件中用户密码: 可以通过sys_monitor.sh ...

  8. git stash总结

    git stash 1. git stash save "message" ​ 执行存储,并添加备注信息(直接git stash 也可以,但没有备注信息) 2. git stash ...

  9. Java 多线程:线程池

    Java 多线程:线程池 作者:Grey 原文地址: 博客园:Java 多线程:线程池 CSDN:Java 多线程:线程池 工作原理 线程池内部是通过队列结合线程实现的,当我们利用线程池执行任务时: ...

  10. Linux宝塔后台管理地址使用SSL,并部署非443端口的https

    上传你的key和pem,然后点设置 点击配置文件 插入代码 1 ssl on; 2 ssl_certificate /xxx/yyy/zzz.pem; 3 ssl_certificate_key /x ...