RabbitMQ Java客户端运行报SLF4J加载失败与UnknownHostException异常
报错根因
你遇到的连接报错由两个核心配置错误导致,SLF4J相关输出是不影响主流程的警告:
setHost()方法参数格式错误:该方法仅接收主机名/IP地址作为入参,不需要带http://协议前缀。你传入完整URL后,客户端会把http://localhost:15672整体作为主机名执行DNS解析,自然无法找到对应地址,直接抛出UnknownHostException。- 端口使用错误:15672是RabbitMQ管理控制台的Web页面端口,Java客户端通过AMQP协议连接服务,默认使用的端口是5672。
- SLF4J警告原因:项目仅引入了amqp-client依赖,缺少SLF4J日志框架的具体实现包,不会影响核心连接逻辑,仅会导致日志无法正常输出。
另外你的原始生产者代码存在逻辑遗漏:仅完成了队列声明,没有调用消息发送方法,就算连接成功也不会真的把消息投递到队列里。
修复步骤
1. 修正生产者连接配置
修改Producer.java中的连接初始化代码,替换为正确配置:
ConnectionFactory factory = new ConnectionFactory(); // 仅传入主机名,不带协议前缀 factory.setHost("localhost"); // AMQP默认端口为5672,未修改默认配置的话可以省略该行 factory.setPort(5672); // RabbitMQ默认账号密码均为guest,未修改认证配置的话需要加上 factory.setUsername("guest"); factory.setPassword("guest");
补全消息发送逻辑,修正后完整Producer代码如下:
package org.rabbitmq.org.rabbitmq.helloworld; import com.rabbitmq.client.ConnectionFactory; import com.rabbitmq.client.Connection; import com.rabbitmq.client.Channel; public class Producer { private static final String QUEUE_NAME="hello"; public static void main(String[] args) throws Exception{ ConnectionFactory factory = new ConnectionFactory(); factory.setHost("localhost"); factory.setUsername("guest"); factory.setPassword("guest"); try(Connection conn = factory.newConnection(); Channel channel = conn.createChannel()){ channel.queueDeclare(QUEUE_NAME,false,false,false,null); String msg = "Hi, i am Rahul"; // 补全消息发送逻辑 channel.basicPublish("", QUEUE_NAME, null, msg.getBytes()); System.out.println("Pushed message -> "+msg); } } }
2. (可选)消除SLF4J警告
在pom.xml的<dependencies>节点下添加SLF4J简单实现依赖即可:
<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-simple</artifactId> <version>1.7.36</version> </dependency>
3. 服务校验
启动代码前确认:
- RabbitMQ服务正常运行,5672端口未被防火墙拦截
- 如果是容器化部署的RabbitMQ,需要同时映射5672(AMQP服务)和15672(管理界面)两个端口,不要只映射管理界面端口
内容的提问来源于stack exchange,提问作者Rahul
相关产品推荐
相关产品推荐

