交换机 Exchange
交换机是RabbitMQ的消息路由器,负责接收生产者发送的消息并根据路由规则转发到匹配的队列。
基本概念
生产者不直接将消息发送到队列,而是发送到交换机。交换机根据绑定规则、路由键等条件决定消息去向。
XML
Producer ──> Exchange ──> Queue ──> Consumer
四种交换机类型
1. Direct Exchange(直连交换机)
精确匹配路由键,消息的路由键与Binding Key完全一致才转发。
2. Fanout Exchange(扇出交换机)
广播模式,忽略路由键,将消息复制后转发到所有绑定队列。
3. Topic Exchange(主题交换机)
模式匹配路由键,支持 *(匹配一个单词)和 #(匹配零或多个单词)通配符。
4. Headers Exchange(头交换机)
根据消息头部属性匹配,不依赖路由键。
创建队列时若未指定交换机类型,默认为Direct类型。
Java Client 示例
Maven依赖:
Java
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>5.18.0</version>
</dependency>
声明交换机:
Java
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.BuiltinExchangeType;
public class ExchangeExample {
private static final String EXCHANGE_NAME = "my_exchange";
public static void main(String[] args) throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
try (Connection connection = factory.newConnection();
Channel channel = connection.createChannel()) {
// 声明直连交换机
channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.DIRECT);
// 声明扇出交换机
channel.exchangeDeclare("broadcast_exchange", BuiltinExchangeType.FANOUT);
// 声明主题交换机
channel.exchangeDeclare("topic_exchange", BuiltinExchangeType.TOPIC);
System.out.println("交换机声明完成");
}
}
}
发送消息到交换机:
text
// 发送消息到指定交换机,第二个参数为routing key
String message = "Hello RabbitMQ";
String routingKey = "order.create";
channel.basicPublish(EXCHANGE_NAME, routingKey, null, message.getBytes("UTF-8"));
System.out.println("消息已发送: " + message);
注意事项
- 交换机必须先声明才能使用,重复声明相同名称但类型不同的交换机会报错
- 消息发送到不存在的交换机时,默认会抛出
Channel shutdown异常- Fanout交换机忽略路由键,所有绑定队列都会收到消息副本
- Topic交换机的路由键单词间用
.分隔,如user.login.success
要点总结
- 交换机是消息路由的核心组件,生产者只与交换机交互
- Direct交换机精确匹配,Fanout交换机广播到所有队列,Topic交换机支持通配符模式
- 通过
channel.exchangeDeclare()声明交换机,需指定名称和类型 - 交换机类型不可更改,删除重建是修改类型的唯一方式
文章存放路径:D:\git2\jwdev\articles\RABBITMQ\入门\核心概念入门\交换机 Exchange.md
📝 发现内容有误?点击此处直接编辑