Java容器连接RabbitMQ容器出现Connection refused问题求助
问题描述
我有一个Java容器需要从RabbitMQ容器获取消息,使用的连接代码如下:
ConnectionFactory factory = new ConnectionFactory(); factory.setHost("rabbit2"); factory.setPort(5673); factory.setUsername("guest"); factory.setPassword("guest"); log.info("Got here!"); Connection connection = null; try { connection = factory.newConnection("Connection1"); } catch (Exception e) { log.error(e.getMessage(), e); throw e; }
依赖库配置:
<dependency> <groupId>com.rabbitmq</groupId> <artifactId>amqp-client</artifactId> <version>4.0.0</version> </dependency>
通过Docker Compose部署,RabbitMQ容器配置:
output_mb: image: rabbitmq:3-management hostname: rabbit2 container_name: output_mb ports: - 5673:5672 - 15673:15672 volumes: - "./output_mb/rabbitmq.config:/etc/rabbitmq/rabbitmq.config" - "./output_mb/definitions.json:/etc/rabbitmq/definitions.json" networks: - common_network
Java容器配置:
pollution_dashboard: container_name: pollution_dashboard image: pollution_dashboard:latest restart: on-failure hostname: pollution_dashboard depends_on: - input_mb - output_mb ports: - 8080:8080 build: context: ./pollution_dashboard/pollution_dashboard dockerfile: ./Dockerfile networks: - common_network
运行Docker Compose后,Java服务持续出现Connection refused错误,但栈中其他语言的服务可正常与RabbitMQ实例通信,请问问题可能出在哪里?
可能的问题点
- 端口配置错误:Docker Compose中RabbitMQ的端口映射
5673:5672是将宿主机5673端口映射到容器内部的5672端口。容器间通信时,应直接使用RabbitMQ容器内部的端口5672,而非宿主机的映射端口5673。其他语言服务能正常通信,大概率是它们使用了5672端口,而Java代码错误配置为5673,这是最可能的核心问题。 - RabbitMQ用户访问限制:检查挂载的
rabbitmq.config,确认是否存在guest用户仅允许localhost访问的配置。RabbitMQ默认限制guest用户只能从localhost连接,若未修改该配置,Java容器以guest用户从容器网络连接会被拒绝。其他服务能正常通信可能是因为使用了其他授权用户,或配置文件已放开该限制。 - 服务启动时机问题:
depends_on仅保证容器启动顺序,不确保RabbitMQ服务完全就绪。Java服务可能在RabbitMQ初始化完成前就尝试连接,导致连接拒绝。可在Java代码中添加连接重试逻辑,或为RabbitMQ配置healthcheck,让Java容器等待RabbitMQ健康后再启动。 - 依赖版本兼容性:当前使用的amqp-client 4.0.0版本与RabbitMQ 3-management镜像需确认版本兼容。虽然理论上兼容,但如果RabbitMQ是较新的3.x版本,可能存在兼容性问题,建议尝试升级amqp-client到5.x系列的稳定版本。
内容的提问来源于stack exchange,提问作者Radu Aramă
相关产品推荐
相关产品推荐

