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头啦

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

最新文章

  1. 第七章 LED将为我闪烁:控制发光二极管
  2. 用python语言讲解数据结构与算法
  3. laravel 表单验证 正则匹配
  4. (Array)27. Remove Element
  5. C# 两行代码实现 延迟加载的单例模式(线程安全)
  6. jquery右下角返回顶部
  7. mysql截取字符串
  8. 手机版WEB开发经验分享,手机版网站开发注意事项,网站自适应,手机版网站自适应,移动安卓APP自适应
  9. layer弹出层中H5播放器全屏出错解决 &amp; 属性poster底图占满&lt;video&gt;的方法
  10. BZOJ-1491-社交网络
  11. java 语法分析器 括号匹配
  12. spring cloud之坑,访问服务时找不到报404
  13. Python数据分析matplotlib可视化之绘图
  14. 捕获未处理的Promise错误
  15. echarts各个配置项详细说明总结
  16. C#使用GET、POST请求获取结果,这里以一个简单的用户登陆为例。
  17. 如何在Windows下安装MYSQL,并截图说明
  18. Eclipse-快捷键大全(转载)
  19. 撩课-Web大前端每天5道面试题-Day26
  20. .NetCore下使用EF DbFirst操作MySql

热门文章

  1. 从零开始Blazor Server(5)--权限验证
  2. typora的第一天
  3. 万答#15,都有哪些情况可能导致MGR服务无法启动
  4. C 语言 时间函数使用技巧(汇总)
  5. Luogu2439 [SDOI2005]阶梯教室设备利用 (动态规划)
  6. 超实用在线工具!能将文字加密为Emoji表情
  7. React报错之Property &#39;value&#39; does not exist on type &#39;HTMLElement&#39;
  8. Java连接简单使用ElasticSearch
  9. Windows平台RTMP/RTSP播放器实现实时音量调节
  10. KingbaseES应对表年龄增长过快导致事务回卷