direct交换机仅支持routingkey与bindingkey的严格字符串相等匹配,必须显式声明、绑定时指定bindingkey,生产者发送时需明确携带routingkey,否则消息被丢弃。

RabbitMQ 的 Direct 交换机靠 RoutingKey 实现一对一或一对多的精确路由,核心就一条:消息的 routingKey 必须完全等于队列绑定时指定的 bindingKey,才投递成功。不是模糊匹配,也不是前缀通配(那是 Topic 模式),就是严格字符串相等。
Direct 交换机必须显式声明
不能复用默认 Exchange(AMQP default),必须自己创建一个类型为 direct 的交换机:
- Java 中调用
channel.exchangeDeclare("my.direct.exchange", "direct") - Spring AMQP 可通过
@Bean DirectExchange声明 - 注意:交换机名要全局唯一,且类型一旦声明不可更改
队列绑定必须指定 bindingKey
绑定不是简单关联,而是带“条件”的注册:
- 每个
queueBind(queueName, exchangeName, routingKey)中的第三个参数就是 bindingKey - 一个队列可以多次绑定同一个交换机,每次用不同 bindingKey(比如同时绑定
"error"和"critical") - bindingKey 是普通字符串,大小写敏感,空格也算字符(
"info"≠"Info")
生产者发消息必须携带 routingKey
发送时必须明确指定 routingKey,它不来自消息体,而是 API 调用的独立参数:
-
channel.basicPublish(exchangeName, "warning", null, msgBytes)—— 第二个参数是 routingKey - 这个值必须和某个队列的 bindingKey 完全一致,否则消息被丢弃(除非配置了备用交换机)
- 常见设计:用业务语义命名,如
"order.created"、"user.deleted"、"payment.failed"
消费者按需订阅,天然支持分流
不同消费者可监听不同 bindingKey 的队列,实现逻辑隔离:
- 日志系统:错误队列绑定
"error",只存 ERROR 级别;告警队列绑定"alert",只触发通知 - 订单系统:支付服务监听绑定
"order.pay"的队列;发货服务监听"order.ship" - 注意:多个队列可以绑定相同 bindingKey(如两个监控服务都绑
"health.check"),此时变成 fanout 行为——但仍是 direct 交换机下的合法用法
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











