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 做精确或模糊路由。

相关推荐
geovindu5 小时前
CSharp: Wordcloud
开发语言·后端·c#·.net·.netcore·词云
geovindu6 小时前
CSharp: Command Pattern
开发语言·后端·c#·.net·.netcore·命令模式·行为模式
tedcloud1237 小时前
OpenLogi 怎么搭建?用 Rust 打造一个轻量的 Logitech 外设管理工具
linux·运维·服务器·开发语言·后端·rust·开源
学长毕业设计8 小时前
基于SpringBoot的健康食谱管理系统的设计与实现(源码+文档+讲解视频)
java·spring boot·后端
逃逸线LOF8 小时前
Spring的AOP简介
java·后端·spring
yume_sibai9 小时前
02-Rust 所有权与借用深入解析(底层原理 + 借用检查器 + 生命周期 + 内部可变性)
开发语言·后端·rust
卷无止境9 小时前
从脚本到程序:Windows平台上的Python打包全景图
后端·python
骇客野人9 小时前
Springboot 的 配置文件 application.yml 和 bootrap.yml 的由来和作用
java·spring boot·后端
岁月宁静9 小时前
三、《从零手撸 Agent》 · system prompt 与核心参数:调好你的旋钮
后端·python·agent
bcbnb9 小时前
Flutter-Notebook代码混淆:Android与iOS平台安全配置
后端·ios