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

相关推荐
布朗克16820 分钟前
39 Spring Boot Web实战
前端·spring boot·后端·实战
西安邮电大学24 分钟前
有关数组的经典算法题
java·后端·其他·算法·面试
山东点狮信息科技有限公司24 分钟前
点狮HRM-HRM系统安全体系与数据保护方案
后端·安全·spring·spring cloud·微服务·系统安全·资产
摇滚侠42 分钟前
SpringMVC 入门到实战 SpringMVC 的执行流程 96
java·后端·spring·maven·intellij-idea
布朗克1681 小时前
38 Spring Boot入门——自动配置、核心注解与Starter机制
java·spring boot·后端
程序员老申1 小时前
外呼突然全挂了,追查 24 分钟后我发现了 etcd 最阴的一颗雷
后端·程序员
何以解忧,唯有..1 小时前
Go语言变量的声明方式详解
开发语言·后端·golang
长栎1 小时前
MyBatis 缓存为啥总是失效?装饰器模式套娃的代价
后端
bright_ye1 小时前
setjmp & longjmp 深度详解 + 代码示例
后端
To_OC1 小时前
我一直以为 Ajax 是个黑盒,直到我写了这 50 行代码
前端·后端·全栈