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