rabbitmq中fanout exchange实现广播需三步:声明fanout类型交换机、多个独立队列绑定其上、发送消息时routing key为空;它无视routing key,有绑即发,一发全收。

Java 中用 RabbitMQ 的 Fanout Exchange 实现广播,核心就三点:声明 fanout 类型交换机、多个队列绑定到它、发消息时不设 routing key。它不挑队列,有绑就发,一发全收。
声明 Fanout 类型的 Exchange
必须显式指定类型为 fanout,否则无法触发广播行为。其他类型(如 direct、topic)做不到无差别分发。
- 使用 Channel 调用
exchangeDeclare("my_fanout", BuiltinExchangeType.FANOUT),推荐用BuiltinExchangeType.FANOUT常量,避免字符串拼写错误 - 若需持久化(服务重启后交换机仍存在),第三个参数传
true;临时交换机则传false - 管理界面创建时,在 “Add a new exchange” 页面中 Type 下拉选 Fanout 即可
为每个消费者创建并绑定独立队列
每个消费者应拥有自己的队列,队列名建议唯一(可用随机名或业务标识),避免多个消费者争抢同一队列。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 调用
queueDeclare()创建队列,返回的队列名可用于后续绑定;也可显式指定名称,如queueDeclare("fanout.queue1", true, false, false, null) - 绑定时调用
queueBind(queueName, exchangeName, ""),第三个参数(routing key)可为空字符串或任意值,Fanout 会直接忽略它 - 一个 Fanout Exchange 可绑定多个队列,例如
fanout.queue1、fanout.queue2、log.backup.queue,全部都能收到同一条消息
发送消息:只认 Exchange,不看 routing key
生产者只需把消息发给 Fanout Exchange,无需关心路由逻辑,也不需要匹配任何键。
- 调用
basicPublish(exchangeName, "", props, body),第二个参数(routing key)填空字符串即可 - 消息体(body)和属性(如
MessageProperties.PERSISTENT_TEXT_PLAIN)照常设置,Fanout 不修改内容 - 注意:如果当前没有队列绑定到该 Exchange,消息会被直接丢弃(除非配置了备用交换机)
启动多个消费者监听不同队列
每个消费者监听自己专属队列,彼此完全解耦,互不影响。
- 可用
@RabbitListener(queues = "fanout.queue1")注解方式快速接入 Spring AMQP - 原生客户端则对每个队列调用
basicConsume(queueName, autoAck, ...),配合DefaultConsumer处理投递 - 典型场景:订单服务发一条“订单已创建”,用户服务、库存服务、日志服务分别监听不同队列,各自执行对应逻辑
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










