Java程序无法连接指定端口的RabbitMQ Docker实例求助
问题描述
我环境中部署了两个RabbitMQ Docker容器,一个外部端口为5672,另一个为5673。使用amqp-client Maven库编写非容器化Java程序,尝试连接监听5673端口的容器,代码如下:
ConnectionFactory factory = new ConnectionFactory(); Connection connection = factory.newConnection("amqp://guest:guest@localhost:5673"); Channel channel = connection.createChannel(); channel.queueDeclare("region", true, false, false, null); DefaultConsumer consumer = new DefaultConsumer(channel) { @Override public void handleConsumeOk(String consumerTag) { super.handleConsumeOk(consumerTag); } @Override public void handleDelivery( String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException { String message = new String(body, StandardCharsets.UTF_8); log.info(message); } }; channel.queueBind("region", "gas_region", ""); channel.basicConsume("region", true, consumer);
但问题是Java程序始终连接到5672端口的实例,表现为创建的队列出现在5672实例中,且无法找到5673实例中配置的exchange。Docker Compose配置如下:
input_mb: image: rabbitmq:3-management hostname: rabbit1 container_name: input_mb ports: - 5672:5672 - 15672:15672 volumes: - "./input_mb/rabbitmq.config:/etc/rabbitmq/rabbitmq.config" - "./input_mb/definitions.json:/etc/rabbitmq/definitions.json" networks: - common_network 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
请问可能是什么原因导致的?
可能的原因及解决办法
- ConnectionFactory参数未正确覆盖:部分版本的amqp-client中,直接通过
newConnection(String uri)传入地址的方式,可能不会完全覆盖ConnectionFactory的默认配置(比如默认端口5672)。建议显式设置所有连接参数来确保准确性:ConnectionFactory factory = new ConnectionFactory(); factory.setHost("localhost"); factory.setPort(5673); factory.setUsername("guest"); factory.setPassword("guest"); Connection connection = factory.newConnection(); - 容器端口映射异常:检查
output_mb容器是否正常运行,执行docker ps确认主机的5673端口确实绑定到了该容器的5672端口。如果存在旧容器残留,可能导致端口占用,新容器无法完成映射,可尝试重启容器或清理旧容器。 - 旧连接复用:Java程序可能复用了之前建立的到5672端口的连接(比如连接池缓存),建议重启Java程序,或者在代码中确保每次创建连接时都明确指定端口,避免复用无效连接。
- RabbitMQ容器内部配置问题:查看
output_mb的rabbitmq.config,确认容器内的RabbitMQ服务实际监听的是5672端口。可以进入容器执行rabbitmq-diagnostics listeners命令,检查服务的实际监听端口,若内部端口不是5672,会导致外部映射无效。
内容的提问来源于stack exchange,提问作者Radu Aramă
相关产品推荐
相关产品推荐

