@Configuration 类集中声明 Queue / Exchange / Binding 的 Bean的示例
Direct 模式
@Configuration
public class DirectRabbitConfig {
// 1. 声明交换机
@Bean
public DirectExchange orderDirectExchange() {
// 参数:名称、是否持久化、是否自动删除
return new DirectExchange("order.direct.exchange", true, false);
}
// 2. 声明队列
@Bean
public Queue orderCreateQueue() {
return QueueBuilder.durable("order.create.queue").build();
}
@Bean
public Queue orderCancelQueue() {
return QueueBuilder.durable("order.cancel.queue").build();
}
// 3. 声明绑定关系:队列 + 交换机 + 路由键
@Bean
public Binding orderCreateBinding() {
return BindingBuilder.bind(orderCreateQueue())
.to(orderDirectExchange())
.with("order.create");
}
@Bean
public Binding orderCancelBinding() {
return BindingBuilder.bind(orderCancelQueue())
.to(orderDirectExchange())
.with("order.cancel");
}
}
消费者端只需要写 @RabbitListener(queues = "order.create.queue") 即可,不需要再重复声明拓扑:
@Component
public class OrderConsumer {
@RabbitListener(queues = "order.create.queue")
public void handleCreate(String msg) {
System.out.println("处理创建订单: " + msg);
}
@RabbitListener(queues = "order.cancel.queue")
public void handleCancel(String msg) {
System.out.println("处理取消订单: " + msg);
}
}
发送端直接指定交换机和路由键:
rabbitTemplate.convertAndSend("order.direct.exchange", "order.create", "订单创建消息");
rabbitTemplate.convertAndSend("order.direct.exchange", "order.cancel", "订单取消消息");
=========================================================
Fanout 模式
【Fanout 的 Binding 不需要路由键,.with() 传空字符串或直接调用 .to() 即可】
@Configuration
public class FanoutRabbitConfig {
@Bean
public FanoutExchange configFanoutExchange() {
return new FanoutExchange("config.fanout.exchange", true, false);
}
@Bean
public Queue smsQueue() {
return QueueBuilder.durable("config.sms.queue").build();
}
@Bean
public Queue emailQueue() {
return QueueBuilder.durable("config.email.queue").build();
}
@Bean
public Binding smsBinding() {
return BindingBuilder.bind(smsQueue()).to(configFanoutExchange());
}
@Bean
public Binding emailBinding() {
return BindingBuilder.bind(emailQueue()).to(configFanoutExchange());
}
}
、发送时路由键传空字符串:rabbitTemplate.convertAndSend("config.fanout.exchange", "", "配置变更通知"),两个队列都会收到。
=================================================================
Topic 模式
【Topic 的 Binding 路由键支持 * 和 # 通配符。】
@Configuration
public class TopicRabbitConfig {
@Bean
public TopicExchange logTopicExchange() {
return new TopicExchange("log.topic.exchange", true, false);
}
@Bean
public Queue allErrorQueue() {
return QueueBuilder.durable("log.error.all.queue").build();
}
@Bean
public Queue orderLogQueue() {
return QueueBuilder.durable("log.order.queue").build();
}
// 匹配所有以 .error 结尾的路由键,如 order.error、pay.error
@Bean
public Binding allErrorBinding() {
return BindingBuilder.bind(allErrorQueue())
.to(logTopicExchange())
.with("*.error");
}
// 匹配 order 开头的所有路由键,如 order.error、order.info
@Bean
public Binding orderLogBinding() {
return BindingBuilder.bind(orderLogQueue())
.to(logTopicExchange())
.with("order.#");
}
}

浙公网安备 33010602011771号