Exchange 交换机类型,六种工作模式与 Spring Boot 整合

一.Exchange 交换机类型

RabbitMQ 有四种内置交换机,下面直接上 Spring Boot 代码。


1. Direct Exchange(精确匹配)

场景 :根据路由键精确投递,比如 order.create 只发给订单创建队列。

配置类

java 复制代码
@Configuration
public class DirectConfig {

    public static final String EXCHANGE = "direct.exchange";
    public static final String QUEUE = "direct.queue";
    public static final String ROUTING_KEY = "order.create";

    @Bean
    public Queue directQueue() {
        return new Queue(QUEUE);
    }

    @Bean
    public DirectExchange directExchange() {
        return new DirectExchange(EXCHANGE);
    }

    @Bean
    public Binding directBinding() {
        return BindingBuilder.bind(directQueue())
                .to(directExchange())
                .with(ROUTING_KEY);
    }
}

生产者

typescript 复制代码
@Service
public class DirectProducer {
    @Autowired
    private RabbitTemplate rabbitTemplate;

    public void send(String msg) {
        rabbitTemplate.convertAndSend(
            DirectConfig.EXCHANGE, 
            "order.create", 
            msg
        );
    }
}

消费者

typescript 复制代码
@Component
public class DirectConsumer {
    @RabbitListener(queues = "direct.queue")
    public void receive(String msg) {
        System.out.println("Direct 收到: " + msg);
    }
}

2. Fanout Exchange(广播)

场景:一条消息发给所有绑定的队列,无视 routing key。

typescript 复制代码
@Bean
public FanoutExchange fanoutExchange() {
    return new FanoutExchange("fanout.exchange");
}

@Bean
public Queue fanoutQueueA() { return new Queue("fanout.A"); }

@Bean
public Queue fanoutQueueB() { return new Queue("fanout.B"); }

@Bean
public Binding bindA() {
    return BindingBuilder.bind(fanoutQueueA()).to(fanoutExchange());
}

@Bean
public Binding bindB() {
    return BindingBuilder.bind(fanoutQueueB()).to(fanoutExchange());
}

发消息时 routing key 写 "" 即可:

arduino 复制代码
rabbitTemplate.convertAndSend("fanout.exchange", "", "广播消息");

3. Topic Exchange(通配符匹配)

场景 :按主题分类,如 order.# 匹配所有订单消息。

typescript 复制代码
@Bean
public TopicExchange topicExchange() {
    return new TopicExchange("topic.exchange");
}

@Bean
public Queue topicQueue() {
    return new Queue("topic.queue");
}

@Bean
public Binding topicBinding() {
    // # 匹配零个或多个单词,* 匹配一个单词
    return BindingBuilder.bind(topicQueue())
            .to(topicExchange())
            .with("order.#");
}

4. Headers Exchange(头匹配)

用得少,被 Topic 替代,面试知道有这个东西就行。


小结 :Direct 最常用,Fanout 做广播,Topic 做灵活路由。代码套路都是 Queue + Exchange + Binding 三板斧。


二.六种工作模式与 Spring Boot 整合

六种模式本质就是 Exchange + Queue 的不同组合,下面挑最常用的三种写代码。


1. Simple / Work Queue(一个队列多个消费者竞争)

配置

typescript 复制代码
@Bean
public Queue workQueue() {
    return new Queue("work.queue");
}

两个消费者(模拟竞争):

typescript 复制代码
@Component
public class WorkConsumer {

    @RabbitListener(queues = "work.queue")
    public void worker1(String msg) {
        System.out.println("Worker1 处理: " + msg);
    }

    @RabbitListener(queues = "work.queue")
    public void worker2(String msg) {
        System.out.println("Worker2 处理: " + msg);
    }
}

生产者

arduino 复制代码
rabbitTemplate.convertAndSend("", "work.queue", "任务" + i);

注意:这里 Exchange 为空字符串,表示使用默认 Direct Exchange,routing key 直接写队列名。


2. Publish/Subscribe(发布订阅)

就是 Fanout Exchange,见记录二。一条消息多个消费者各自收到一份。


3. Routing(路由模式)

Direct Exchange 的实战版,比如日志按级别路由:

typescript 复制代码
@Bean
public DirectExchange logExchange() {
    return new DirectExchange("log.exchange");
}

@Bean
public Queue errorQueue() { return new Queue("log.error"); }

@Bean
public Queue infoQueue() { return new Queue("log.info"); }

@Bean
public Binding errorBinding() {
    return BindingBuilder.bind(errorQueue())
            .to(logExchange()).with("error");
}

@Bean
public Binding infoBinding() {
    return BindingBuilder.bind(infoQueue())
            .to(logExchange()).with("info");
}

发消息:

arduino 复制代码
rabbitTemplate.convertAndSend("log.exchange", "error", "系统崩溃");
rabbitTemplate.convertAndSend("log.exchange", "info", "用户登录");

4. Topic 模式实战

csharp 复制代码
// 绑定键:只接收 china 相关的天气新闻
@Bean
public Binding weatherBinding() {
    return BindingBuilder.bind(weatherQueue())
            .to(topicExchange())
            .with("china.weather.#");
}

小结:Work Queue 做任务分发,Pub/Sub 做广播,Routing/Topic 做精确或模糊路由。

相关推荐
日月云棠4 小时前
11 Spring容器整合与核心接口体系
java·后端
日月云棠4 小时前
10 AOP与动态编译源码剖析
java·后端
蓝银草同学5 小时前
新手指南:快速理清独立仓库 Java 8 多模块项目依赖并运行
前端·后端
蓝银草同学5 小时前
前端转 Java,第一篇看懂 pom.xml:Maven 依赖管理从入门到不懵
前端·后端
IT策士5 小时前
Django 从 0 到 1 打造完整电商平台:收货地址管理
后端·python·django
HjhIron5 小时前
从三件套到模块化:前端开发的底层思维
前端·后端
前端市界5 小时前
在阿里云 Docker 中管理 MySQL 8.0:常用命令与 Docker Compose 最佳实践
后端
咖啡八杯5 小时前
微信小程序人脸认证1.0迁移2.0
后端·微信小程序
甘露s5 小时前
JWT Token 机制设计演进:从单 Token 到企业级认证体系
后端·http·web