系列文章目录
1.SpringBoot整合RabbitMQ并实现消息发送与接收
2. 解析JSON格式参数 & 修改对象的key
3. VUE整合Echarts实现简单的数据可视化
4. List<HashMap<String,String>>实现自定义字符串排序(key排序、Value排序)
5. 使用AOP切面实现日志记录功能
文章目录
- 系列文章目录
- 前言
- 一、交换机定义以及作用
- 二、为什么使用交换机
- 三、创建交换机
- 3.1 创建交换机和队列
- 3.2 创建接收者
- 3.3 编写访问接口发送消息
- 四、效果图
- 4.1 postman调用接口
- 4.2 控制台打印
- 4.3 RabbitMq平台查看
- 总结
前言
注:在学习交换机前,先要学习SpringBoot整合RabbitMQ的步骤和队列间的消息发送和接收:
因为以前写过《SpringBoot整合RabbitMQ并实现消息发送与接收》的文章,所以这篇文章设计到上篇文章的内容不会再进行讲解。如果有什么代码看不懂,请先查看上一篇文章:SpringBoot整合RabbitMQ并实现消息发送与接收 这篇文章重点讲述交换机的使用,理解交换机的作用和为什么要使用交换机。使大家能够在业务场合上去熟练的使用交换机实现不同的业务。
一、交换机定义以及作用
在RabbitMQ中,交换机(Exchange)是消息传递的核心组件之一。它负责接收来自生产者的消息,并将其路由到一个或多个称为队列(Queue)的目标。可以把交换机看做是一个邮局,生产者将消息投递到邮局中,交换机会根据消息的路由键将消息分发到不同的邮箱中。
交换机根据规则将收到的消息分发给绑定到它上面的队列。这些规则可以通过指定交换机类型和绑定键(Binding Key)来定义。RabbitMQ提供了几种不同类型的交换机:
- 直接交换机(Direct Exchange):它将消息路由到与绑定键完全匹配的队列。
- 主题交换机(Topic Exchange):它根据绑定键和通配符的匹配规则将消息路由到一个或多个队列。
- 扇形交换机(Fanout Exchange):它将消息广播到所有绑定到它上面的队列,忽略绑定键。
- 头部交换机(Headers Exchange):它根据消息的头部属性进行匹配,将消息路由到与头部属性匹配的队列。
交换机的选择取决于消息的路由需求和业务场景。通过合理配置交换机和队列的绑定关系,可以实现灵活的消息路由和分发机制。
二、为什么使用交换机
使用交换机的主要目的是实现消息的路由(Routing)和分发(Distribution),以及实现解耦和灵活性。以下是一些使用交换机的重要原因:
- 灵活的消息路由:通过使用交换机,可以根据消息的路由键将消息发送到指定的队列中。这样可以实现不同类型的消息分发到不同的消费者,从而实现对消息的灵活控制。
- 解耦生产者和消费者:交换机可以实现解耦,即生产者不需要知道消息将被发送到哪个具体的队列,只需要将消息发送到指定的交换机即可,交换机会负责将消息路由到相应的队列中。
- 消息过滤和按需消费:通过合理配置交换机和队列的绑定关系,可以实现消息的过滤和按需消费,确保消息只被相关的消费者接收。
- 消息广播和订阅:某些类型的交换机(如Fanout Exchange)可以将消息广播到所有与之绑定的队列中,实现消息的订阅和广播功能。
- 支持多种消息分发策略:不同类型的交换机支持不同的消息分发策略,如直接匹配、通配符匹配等,从而满足不同场景下的消息路由需求。
总之,使用交换机可以提高消息系统的灵活性、可靠性和可维护性,使得消息的生产、路由和消费能够更加高效和灵活。
三、创建交换机
在理解了交换机的作用后,我们通过代码去使用交换机实现消息的发送与接收。这里我的案例使用最常用的**直接交换机(Direct Exchange)**实现消息的发送和接收。
3.1 创建交换机和队列
下述代码中,创建交换机完成后,需要将队列绑定到交换机上,这里的.with("info")
是routingKey,因为将消息给到交换机后,一个交换机可以绑定多个队列,但将消息发送到哪个队列,就需要routingKey去判断发送到哪个队列。
/**
* 配置:
* 创建交换机、创建队列、将队列绑定到交换机上
*/
@Configuration
public class RabbitMQConfig {
// 创建交换机
@Bean
public DirectExchange directExchange() {
System.err.println("心态~ 创建交换机:xintai_exchange");
return new DirectExchange("xintai_exchange");
}
// 创建队列
@Bean
public Queue myQueue() {
System.err.println("心态~ 创建队列:my_queue1");
return new Queue("my_queue1");
}
// 将队列绑定到交换机上
@Bean
public Binding binding(Queue myQueue, DirectExchange directExchange) {
System.err.println("心态~ 将队列绑定到交换机上");
return BindingBuilder.bind(myQueue).to(directExchange).with("info");
}
}
3.2 创建接收者
@RabbitListener
用来监听上述创建的队列my_queue1的消息。
/**
* 接收消息
*/
@Component
public class Consumer {
@RabbitListener(queues = "my_queue1")
public void receiveMessage(String message) {
System.out.println("心态~ my_queue1队列接收到消息:" + message);
}
}
3.3 编写访问接口发送消息
下述代码中,rabbitTemplate.convertAndSend
是rabbitmq用来发送消息的方法。其中第一个参数是交换机的名称(创建时的名称),第二个参数是routingKey,这里也是在上述代码中创建的,第三个参数就是需要发送的消息内容。
@RestController
@RequestMapping("/messages1")
public class MessageController1 {
// @Autowired
// private Producer producer;
@Autowired
private RabbitTemplate rabbitTemplate;
@PostMapping("/send1")
public String sendMessage(@RequestParam String message) {
System.err.println("心态~ 进入Controller层,接收到消息message ="+message);
System.err.println("心态~ convertAndSend 转换并发送xintai_exchange交换机,routingKey为info");
rabbitTemplate.convertAndSend("xintai_exchange", "info", message);
return "消息发送成功!";
}
}
四、效果图
4.1 postman调用接口
代码就编写完了,启动项目,启动rabbitmq。在postman中调用接口去发送消息。如下图所示:
4.2 控制台打印
发送完消息后,查看控制台打印效果,可得看到以成功接收到消息。如下图所示:
4.3 RabbitMq平台查看
登录http://localhost:15672,点击exchanges,可看到代码创建的交换机。如下图所示:
点击xintai_exchange
交换机,会看到这个交换机里队列详情信息。如下图所示:
总结
这边就实现了交换机的使用,看到这里您也一定实现了这个发送消息的操作吧。但您一定会想到,如果一个交换机有多个队列,那怎么配置呢?怎么去实现只将消息发送到一个交换机里的一个队列呢?这就是routingKey配置和在RabbitMQConfig直接创建队列进行绑定就行。原理一样,大家多多思考练习~