生产者发送消息到交换机需先建立连接并创建信道,再声明交换机(或复用默认交换机),最后调用basicpublish推送消息;全过程不经过队列,队列仅为路由目标;可启用确认机制与持久化提升可靠性。

生产者发送消息到交换机,核心是建立连接、创建信道、声明交换机(或复用已有)、再调用 basicPublish 把消息“推”过去。整个过程不经过队列,队列只是后续被交换机路由的目标。
建立连接与信道
生产者必须先连上 RabbitMQ 服务器,再在连接上打开一个信道(Channel)——所有操作都在信道上进行,不是直接走连接。
- 用
ConnectionFactory配置 host、port、virtualHost、username、password - 调用
factory.newConnection()获取连接 - 再通过
connection.createChannel()创建信道
声明或确认交换机
交换机必须存在,才能接收消息。生产者可以主动声明,也可以依赖运维提前建好。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 调用
channel.exchangeDeclare("my_exchange", "direct")声明直连交换机 - 第二个参数支持
"direct"、"fanout"、"topic"、"headers" - 若只用默认交换机(空字符串),这步可省略,它始终存在
调用 basicPublish 发送消息
这是真正“发出去”的一步:指定交换机名、路由键、消息属性、消息体。
- 语法:
channel.basicPublish(exchange, routingKey, props, body) - 向默认交换机发消息:exchange 传
"",routingKey 必须等于目标队列名 - 向自定义交换机发消息:exchange 传已声明的名称,routingKey 按交换机类型匹配(如 direct 要精确,fanout 可传空字符串)
- 消息体需是
byte[],常用"hello".getBytes(StandardCharsets.UTF_8)
可选但推荐:启用生产者确认
确保消息确实到达 Broker,避免网络丢包或服务不可用导致静默失败。
- 在 channel 上调用
channel.confirmSelect() - 后续每条消息可通过
channel.waitForConfirms()同步等待 ACK,或注册回调异步处理 - 搭配消息持久化(
MessageProperties.PERSISTENT_TEXT_PLAIN)更可靠
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










