全部学科
NodeJS全栈
nodejs
Python全栈
python
小程序首页
📅 2026-05-22 8 分钟 ✍️ juanwangdev

交换机 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);

注意事项

  1. 交换机必须先声明才能使用,重复声明相同名称但类型不同的交换机会报错
  2. 消息发送到不存在的交换机时,默认会抛出 Channel shutdown 异常
  3. Fanout交换机忽略路由键,所有绑定队列都会收到消息副本
  4. Topic交换机的路由键单词间用 . 分隔,如 user.login.success

要点总结

  • 交换机是消息路由的核心组件,生产者只与交换机交互
  • Direct交换机精确匹配,Fanout交换机广播到所有队列,Topic交换机支持通配符模式
  • 通过 channel.exchangeDeclare() 声明交换机,需指定名称和类型
  • 交换机类型不可更改,删除重建是修改类型的唯一方式

文章存放路径:D:\git2\jwdev\articles\RABBITMQ\入门\核心概念入门\交换机 Exchange.md

📝 发现内容有误?点击此处直接编辑

← 上一篇 系统本地安装(可选)
下一篇 → 绑定 Binding
想查看更多题目和详细解析?
小程序提供完整的题库、模拟考试和详细解析
马上就来

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库