You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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ă

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 08:45:03