Java中用RabbitMQ实现基础消息收发,核心是围绕连接、队列、发送和接收四个环节展开:先引入amqp-client依赖,配置host、port、virtualHost、username和password建立连接;生产者通过queueDeclare声明持久化队列,再用basicPublish向默认交换机(空字符串)发送消息;消费者用相同参数声明队列,通过basicConsume设置DeliverCallback持续监听并自动确认。

Java 中用 RabbitMQ 实现基础消息收发,核心是围绕连接、队列、发送和接收四个环节展开。不需要复杂配置,只要生产者把消息发到指定队列,消费者监听同一队列就能完成点对点通信。关键在于两端使用相同的队列名、连接参数一致,且都基于默认直连交换机(空字符串)工作。
准备依赖和连接配置
先在 Maven 中引入客户端库:
<dependency> <groupId>com.rabbitmq</groupId> <artifactId>amqp-client</artifactId> <version>5.18.0</version> </dependency>
连接时需明确以下参数:
-
host:RabbitMQ 服务 IP(如
localhost或具体服务器地址) -
port:默认为
5672(确保防火墙已开放) -
virtualHost:虚拟主机,默认是
/,也可自定义(如/test) - username 和 password:有权限的账号(非 guest,因新版 RabbitMQ 默认禁用 guest 远程登录)
生产者:发消息到队列
流程固定:建工厂 → 连服务器 → 开 Channel → 声明队列 → 发送消息。
立即学习“Java免费学习笔记(深入)”;
声明队列时注意参数含义:
queueDeclare("my_queue", true, false, false, null)- true 表示队列持久化(RabbitMQ 重启后仍存在)
- false, false 表示非排他、非自动删除(适合长期复用)
发送消息直接走默认交换机,路由键就是队列名:
channel.basicPublish("", "my_queue", null, "Hello".getBytes());
消费者:从队列接收消息
同样需要建立连接和 Channel,并确保声明**完全相同名称和参数的队列**(否则可能创建新队列导致收不到消息)。
推荐使用推模式(basicConsume)持续监听:
- 传入队列名、
autoAck=true(自动确认,适合简单场景) - 提供
DeliverCallback处理每条消息体(记得用new String(body, UTF_8)解码) - 不要主动关闭 Channel 或 Connection —— 否则监听中断
常见问题与避坑点
实际运行时容易卡在这几处:
- 连接被拒:检查用户名密码是否正确、guest 是否被限制远程访问、端口是否通(可用 telnet 测试)
- 消息发了但收不到:确认生产者和消费者用的是同一个队列名、同一个 virtualHost、同一个 RabbitMQ 节点
-
消息丢失:若要求不丢数据,需同时设置队列持久化(
durable=true)、消息持久化(MessageProperties.PERSISTENT_TEXT_PLAIN)、消费者手动 ack -
中文乱码:发送和接收都显式指定
StandardCharsets.UTF_8


















