5.RabbitMQ系列之headers交换器
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交换器的更多相关文章
- RabbitMQ系列(三)RabbitMQ交换器Exchange介绍与实践
RabbitMQ交换器Exchange介绍与实践 RabbitMQ系列文章 RabbitMQ在Ubuntu上的环境搭建 深入了解RabbitMQ工作原理及简单使用 RabbitMQ交换器Exchang ...
- 【RabbitMQ系列】队列、绑定、交换器
队列: 从概念上来讲,AMQP消息路由必须有三部分:交换器.队列和绑定.生产者把消息发布到交换器上:消息最终到达队列,并被消费者接收:绑定决定了消息如何从路由器路由到特定的队列. 消费者通过以下两种方 ...
- RabbitMQ系列(二)深入了解RabbitMQ工作原理及简单使用
深入了解RabbitMQ工作原理及简单使用 RabbitMQ系列文章 RabbitMQ在Ubuntu上的环境搭建 深入了解RabbitMQ工作原理及简单使用 RabbitMQ交换器Exchange介绍 ...
- RabbitMQ系列(四)RabbitMQ事务和Confirm发送方消息确认——深入解读
RabbitMQ事务和Confirm发送方消息确认--深入解读 RabbitMQ系列文章 RabbitMQ在Ubuntu上的环境搭建 深入了解RabbitMQ工作原理及简单使用 RabbitMQ交换器 ...
- RabbitMQ系列教程之七:RabbitMQ的 C# 客户端 API 的简介(转载)
RabbitMQ系列教程之七:RabbitMQ的 C# 客户端 API 的简介 今天这篇博文是我翻译的RabbitMQ的最后一篇文章了,介绍一下RabbitMQ的C#开发的接口.好了,言归正传吧. N ...
- RabbitMQ系列教程之三:发布/订阅(Publish/Subscribe)(转载)
RabbitMQ系列教程之三:发布/订阅(Publish/Subscribe) (本教程是使用Net客户端,也就是针对微软技术平台的) 在前一个教程中,我们创建了一个工作队列.工作队列背后的假设是每个 ...
- 在Node.js中使用RabbitMQ系列二 任务队列
在上一篇文章在Node.js中使用RabbitMQ系列一 Hello world我有使用一个任务队列,不过当时的场景是将消息发送给一个消费者,本篇文章我将讨论有多个消费者的场景. 其实,任务队列最核心 ...
- RabbitMQ系列教程之六:远程过程调用(RPC)(转载)
RabbitMQ系列教程之六:远程过程调用(RPC) 远程过程调用(Remote Proceddure call[RPC]) (本实例都是使用的Net的客户端,使用C#编写) 在第二个教程中,我们学习 ...
- RabbitMQ系列教程之五:主题(Topic)(转载)
RabbitMQ系列教程之五:主题(Topic) (本实例都是使用的Net的客户端,使用C#编写),说明,中文方括号[]表示名词. 在上一个教程中,我们改进了我们的日志记录系统. 没有使用只能够进行虚 ...
随机推荐
- Java 将Excel转为XML
可扩展标记语言(XML)文件是一种标准的文本文件,它使用特定的标记来描述文档的结构以及其他特性.通常,我们可以通过格式转换的方式来得到XML格式的文件.本文,将通过Java代码介绍如何实现由Excel ...
- java-servlet-转发AND路径
转发: a) 什么是转发?一个web组件将未完成的任务交给另一个web组件继续做.通常是一个servlet将数据获取之后转交给jsp进行展现.注:web组件值得是servlet或者jsp b) 如何转 ...
- Spring Boot部署方法
Spring Boot部署方法 网上搜到的部署方法无非是打成jar包,然后shell执行nohup java调用jar命令,或者是打成war包然后部署到tomcat或者jetty容器上面. S ...
- 大家都能看得懂的源码 - 如何封装 cookie/localStorage/sessionStorage hook?
本文是深入浅出 ahooks 源码系列文章的第九篇,该系列已整理成文档-地址.觉得还不错,给个 star 支持一下哈,Thanks. 今天来看看 ahooks 是怎么封装 cookie/localSt ...
- github action 实现CI/CD
两种github action 打包.Net Core 项目docker镜像推送到阿里云镜像仓库 1.GitHub Actions 是什么? 大家知道,持续集成由很多操作组成,比如抓取代码.运行测试. ...
- HDU 6222 Heron and His Triangle (pell 方程)
题面(本人翻译) A triangle is a Heron's triangle if it satisfies that the side lengths of it are consecutiv ...
- Springboot重定向,没有位置没有加“/user”,但是url在请求位置的前面“/user”就出现了
是因为":"后面没有加"/" 原先的 return "redirect:main.html"; 正确的 return "redir ...
- c++基础思维导图2
c++基础思维导图2 结构体 结构体的基本概念:用户自定义的数据类型 结构体定义和使用 struct 结构体名{结构体成员} struct 结构体名 变量名: struct 结构体名 变量名 = {成 ...
- dp-LIS LCS 模型
最长上升子序列问题: https://www.cnblogs.com/sxq-study/p/12303589.html 一:两遍LIS问题 1:题目: 怪盗基德是一个充满传奇色彩的怪盗,专门以珠宝为 ...
- docker学习笔记-容器相关命令
新建并启动容器 docker pull centos (先下载镜像,如果没有直接使用docker run 命令会根据本地情况进行下载) # docker run [可选参数] image # 参数说明 ...