rabbitmq的三个交换机及简单使用

news/2025/1/12 15:00:06/

提前说一下,创建队列,交换机,绑定交换机和队列都是在生产者。消费者只负责监听就行了,不用配其他的。

完成这个场景需要两个服务哦。

1直连交换机-生产者的代码。

在配置类中创建队列,交换机,绑定交换机和队列

@Configuration
public class DirectRabbitConfigTest {//队列@Beanpublic Queue TestDirectQueue(){return new Queue("TestDirectQueue",true);}//交换机@BeanDirectExchange TestDirectExchange(){return new DirectExchange("TestDirectExchange",true,false);}//绑定@BeanBinding bindingDirect(){return BindingBuilder.bind(TestDirectQueue()).to(TestDirectExchange()).with("TestDirectRouting");//TestDirectRouting为路由键}
}

发送消息,访问这个接口就行。

@Controller
public class test001 {@Autowiredprivate RabbitTemplate rabbitTemplate;@ResponseBody@GetMapping("/sendDirectMessage")public String sendDirectMessage() {String messageId = String.valueOf(UUID.randomUUID());String messageData = "test message, hello!";String createTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));Map<String,Object> map=new HashMap<>();map.put("messageId",messageId);map.put("messageData",messageData);map.put("createTime",createTime);//将消息携带绑定键值:TestDirectRouting 发送到交换机TestDirectExchangerabbitTemplate.convertAndSend("TestDirectExchange", "TestDirectRouting", map);return "ok";}
}

2直连交换机-消费者的代码

@Component
@RabbitListener(queues = "TestDirectQueue")//监听的队列
public class DirectReceiver {@RabbitHandlerpublic void process(Map testMessage){System.out.println("消息one:"+testMessage.toString());//这个map就是发送的消息}
}

直连交换机总结:你可以自己加几个消费者,发送消息你会发现消息被轮询了。

访问@GetMapping("/sendDirectMessage")消息就发出并被接收。

3topic交换机-生产者的代码

注意:需要自己去控制台添加firstQueue和secondQueue队列,不然消费者启动不起来。原因未知,在直连交换机的时候机器自己创建队列了,topic不知道为啥不行。

@Configuration
public class TopicRabbitConfigTest {//绑定键public final static String man = "topic.man";public final static String woman = "topic.woman";@Beanpublic Queue firstQueue() {//return new Queue(TopicRabbitConfigTest.man);return new Queue("firstQueue");}@Beanpublic Queue secondQueue() {//return new Queue(TopicRabbitConfigTest.woman);return new Queue("secondQueue");}@BeanTopicExchange exchange() {return new TopicExchange("topicExchange");}//将firstQueue和topicExchange绑定,而且绑定的键值为topic.man//这样只要是消息携带的路由键是topic.man,才会分发到该队列@BeanBinding bindingExchangeMessage() {return BindingBuilder.bind(firstQueue()).to(exchange()).with(man);}//将secondQueue和topicExchange绑定,而且绑定的键值为用上通配路由键规则topic.#// 这样只要是消息携带的路由键是以topic.开头,都会分发到该队列@BeanBinding bindingExchangeMessage2() {return BindingBuilder.bind(secondQueue()).to(exchange()).with("topic.#");}}

发送消息,访问这两个接口就行。

@Controller
public class TopicTest002 {@Autowiredprivate RabbitTemplate rabbitTemplate;@GetMapping("/sendTopicMessage1")public String sendTopicMessage1() {String messageId = String.valueOf(UUID.randomUUID());String messageData = "message: M A N ";String createTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));Map<String, Object> manMap = new HashMap<>();manMap.put("messageId", messageId);manMap.put("messageData", messageData);manMap.put("createTime", createTime);rabbitTemplate.convertAndSend("topicExchange", "topic.man", manMap);return "ok";}@GetMapping("/sendTopicMessage2")public String sendTopicMessage2() {String messageId = String.valueOf(UUID.randomUUID());String messageData = "message: woman is all ";String createTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));Map<String, Object> womanMap = new HashMap<>();womanMap.put("messageId", messageId);womanMap.put("messageData", messageData);womanMap.put("createTime", createTime);rabbitTemplate.convertAndSend("topicExchange", "topic.woman", womanMap);return "ok";}
}

4topic交换机-消费者的代码

需要监听两个队列

@Component
@RabbitListener(queues = "firstQueue")//监听的队列
public class TopicManReceiver {@RabbitHandlerpublic void process(Map testMessage) {System.out.println("TopicManReceiver消费者收到消息  : " + testMessage.toString());}}
@Component
@RabbitListener(queues = "secondQueue")//监听的队列
public class TopicWoManReceiver {@RabbitHandlerpublic void process(Map testMessage) {System.out.println("TopicTotalReceiver消费者收到消息  : " + testMessage.toString());}}

先访问@GetMapping("/sendTopicMessage1")接口,再访@GetMapping("/sendTopicMessage2")接口,结果如下:

总结:绑定和发送的时候都要设置路由键。

5fanout交换机-生产者

注意:这种交换机也需要自己去控制台创建队列。fanout交换机不需要设置路由key

@Configuration
public class FanoutRabbitConfigTest {/***  创建三个队列 :fanout.A   fanout.B  fanout.C*  将三个队列都绑定在交换机 fanoutExchange 上*  因为是扇型交换机, 路由键无需配置,配置也不起作用*/@Beanpublic Queue queueA() {return new Queue("fanout.A");}@Beanpublic Queue queueB() {return new Queue("fanout.B");}@Beanpublic Queue queueC() {return new Queue("fanout.C");}@BeanFanoutExchange fanoutExchange() {return new FanoutExchange("fanoutExchange");}@BeanBinding bindingExchangeA() {return BindingBuilder.bind(queueA()).to(fanoutExchange());}@BeanBinding bindingExchangeB() {return BindingBuilder.bind(queueB()).to(fanoutExchange());}@BeanBinding bindingExchangeC() {return BindingBuilder.bind(queueC()).to(fanoutExchange());}}

发送消息,访问这个接口就行。

@Controller
public class FanoutTest003 {@Autowiredprivate RabbitTemplate rabbitTemplate;@GetMapping("/sendFanoutMessage")public String sendFanoutMessage() {String messageId = String.valueOf(UUID.randomUUID());String messageData = "message: testFanoutMessage ";String createTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));Map<String, Object> map = new HashMap<>();map.put("messageId", messageId);map.put("messageData", messageData);map.put("createTime", createTime);rabbitTemplate.convertAndSend("fanoutExchange", null, map);return "ok";}}

6fanout交换机-消费者

@Component
@RabbitListener(queues = "fanout.A")//监听的队列
public class FanoutA {@RabbitHandlerpublic void process(Map testMessage) {System.out.println("FanoutReceiverA消费者收到消息  : " +testMessage.toString());}
}
@Component
@RabbitListener(queues = "fanout.B")//监听的队列
public class FanoutB {@RabbitHandlerpublic void process(Map testMessage) {System.out.println("FanoutReceiverB消费者收到消息  : " +testMessage.toString());}}
@Component
@RabbitListener(queues = "fanout.C")//监听的队列
public class FanoutC {@RabbitHandlerpublic void process(Map testMessage) {System.out.println("FanoutReceiverC消费者收到消息  : " +testMessage.toString());}}

总结:三个消费者都收到了消息

重点:直连交换机不管绑定多少个队列,消息会到达所有队列,然后去消费者方进行轮询。


http://www.ppmy.cn/news/1562539.html

相关文章

如何轻松反转C# List<T>中的元素顺序

在C#中&#xff0c;有多种方法可以反转 List<T> 的元素顺序。以下是几种常见的方法&#xff1a; 方法一&#xff1a;使用 List<T>.Reverse 方法 List<T> 类提供了一个内置的 Reverse 方法&#xff0c;可以就地反转列表中的元素顺序。 using System; using…

elasticsearch常见故障汇总

es的入库突然出现异常&#xff0c;大量超时 查看集群状态&#xff0c;状态为红色 GET _cluster/health 具体查看&#xff0c;实体&#xff0c;看看是那些索引状态异常&#xff0c;看到wb_info_2025-01-08索引状态异常 GET _cat/indices?v 注&#xff1a;其他上面的步骤可以在…

5种IO模型

目录 一、认识IO二、5种IO模型三、非阻塞IO代码 一、认识IO 什么是IO&#xff1f; Input(输入)和Output(输出)。 冯诺依曼体系结构中&#xff0c;数据从输入设备拷贝到内存&#xff0c;经过处理后&#xff0c;再从内存拷贝到输出设备。现实情况中&#xff0c;数据并不是那么流…

pandas与sql对应关系【帮助sql使用者快速上手pandas】

本页旨在提供一些如何使用pandas执行各种SQL操作的示例&#xff0c;来帮助SQL使用者快速上手使用pandas。 目录 SQL语法一、选择SELECT1、选择2、添加计算列 二、连接JOIN ON1、内连接2、左外连接3、右外连接4、全外连接 三、过滤WHERE1、AND2、OR3、IS NULL4、IS NOT NULL5、B…

基于单片机的粮仓环境监测系统设计

本设计是以单片机为核心的粮仓环境监测系统&#xff0c;由单片机、温湿度检测模块、烟雾检测模块、显示模块、继电器模块、NB-IoT通信模块、报警电路等组成&#xff0c;以实现对粮仓内环境的监测功能&#xff0c;使用NB-IoT通信技术将环境信息上传至云平台&#xff0c;以便管理…

【HUAWEI】HCIP-AI-MindSpore Developer V1.0 | 第五章 自然语言处理原理与应用(3 And 4) | 学习笔记

目录 第五章 自然语言处理原理与应用 3 自然语言处理应用系统 ■ 对话系统 ■ 任务型对话系统架构 ■ 对话系统关键技术-自然语言理解 ■ 对话系统关键技术-对话管理 ■ 对话系统关键技术-自然语言生成 4 基于 MindSpore 的自然语言处理实践 ■ 模型实现 ▲ MindSpor…

[Linux]Mysql9.0.1服务端脱机安装配置教程(redhat)

前言 本教程适用于在yum源不可用的LInux主机上安装Mysql的场景。 以redhat系主机做操作示例&#xff0c;debian系主机可参照步骤&#xff0c;将对应的rpm -ivh命令换成dpkg -i。 1. 官网下载安装包 https://dev.mysql.com/downloads/mysql/ 1.1 版本分类 MySQL Enterprise…

牛客网刷题 ——C语言初阶(5操作符)——BC90 矩阵计算

1. 题目描述&#xff1a;BC90 矩阵计算 牛客网OJ链接 输入NxM矩阵&#xff0c;矩阵元素均为整数&#xff0c;计算其中大于零的元素之和。 输入描述: 第一行为N M(N: 矩阵行数&#xff1b;M: 矩阵列数,且M,N10)&#xff0c;接下来的N行为矩阵各行。 输出描述:一行&#xff0c;…