介绍
作用是接收生产者发送的消息,并根据某种规则将这些消息路由到一个或多个队列。交换机根据绑定规则和路由键来决定如何将消息分发到队列。简而言之,交换机是消息路由的核心组件,它负责将消息从生产者引导到适当的队列,以便消费者能够处理这些消息。
交换机类型
交换机分为3种类型。
- Fanout广播 顾名思义将消息广播到交换机绑定的所有队列上,每个队列都可以接收到消息。
- Direct定向 将消息发生给不同的人,不同的服务接收不同的消息,会根据设置的规则发送给指定的队列,称为定向路由。
- Topic话题 与 Direct定向不同的是他的routingKey可以是多个单词的列表以" . "分割。
-
Fanout广播
顾名思义将消息广播到交换机绑定的所有队列上,每个队列都可以接收到消息。
生产者
java
private final RabbitTemplate rabbitTemplate;
@GetMapping("/putRecord")
public Result userMessage(){
rabbitTemplate.convertAndSend("amq.fanout",null,"我是发送者");
//1.交换机 2.路由键 3.消息
return Result.success("操作成功",null);
}
对于 fanout 类型的交换机,路由键会被忽略,因为 fanout 类型的交换机会将消息广播到所有绑定到它的队列。所以,在这种情况下,你可以将路由键设为 null 或者直接忽略这个参数。
消费者
java
@Component
public class RecordQueues {
@RabbitListener(queues ="play.queue")
public void insertUserMessage(String msg){ //支付服务
System.out.println("play.queue");
}
@RabbitListener(queues ="record.queue")
public void recordUserMessage(String msg){ //记录服务
System.out.println("record.queue");
}
}
java
play.queue
record.queue
两个消费者同时收到消息
Direct定向
将消息发生给不同的人,不同的服务接收不同的消息,会根据设置的规则发送给指定的队列,称为定向路由。
- 每一个队列都与交换机设置一个绑定的键名Key
- 消息发送着指定消息的路由键名Key
- 一个队列可以绑定多个键名
这种模式更加的灵活
绑定路由器Key
在绑定队列的时候可以给改队列指定路由键名Key
一个队列可以绑定多个路由器Key
生产者
给路由键名为del的队列发送消息,也就是del.queue和delMsg.queue
java
private final RabbitTemplate rabbitTemplate;
@GetMapping("/putRecord") //插入记录
public Result userMessage(){
rabbitTemplate.convertAndSend("amq.direct","del","我是发送者");
return Result.success("操作成功",null);
}
消费者
java
@Component
public class RecordQueues {
@RabbitListener(queues ="add.queue")
public void a(String msg){ //支付服务
System.out.println("add.queue");
}
@RabbitListener(queues ="del.queue")
public void b(String msg){ //记录服务
System.out.println("query.queue");
}
@RabbitListener(queues ="delMsg.queue")
public void c(String msg){ //记录服务
System.out.println("delMsg.queue");
}
}
java
delMsg.queue
query.queue
Topic话题
Direct定向不同的是他的routingKey可以是多个单词的列表以" . "分割。可以用他区分消息的类型或分组。
通过指定通配符绑定
- #代指0个或多个单词
- * 代指一个单词
例子
假如有以下routingKey(路由键名)
a.a123
a.a147
a.a369
b.b123
b.789
c.123
这个时候想给axx等发信息,可以使用Topic交换机指定a发信息,axx下的队列都会收到。