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

Azure Service Bus Emulator Docker部署及Java连接问题排查

问题排查:Azure Service Bus Emulator Docker部署及Java连接问题

问题描述

  • 自定义Config.json未被容器读取,启动后使用默认配置
  • Java测试代码报错:Connection refused: localhost/[0:0:0:0:0:0:0:1]:443

我的Docker Compose配置

name: microsoft-azure-servicebus-emulator
services:
  emulator:
    container_name: "servicebus-emulator"
    image: mcr.microsoft.com/azure-messaging/servicebus-emulator:latest
    volumes:
      - "Config.json"
    ports:
      - "5672:5672" # AMQP port
      - "9354:9354" # Management port
    environment:
      SQL_SERVER: sqledge
      MSSQL_SA_PASSWORD: Adm1n!@2123
      ACCEPT_EULA: Y
    depends_on:
      - sqledge
    networks:
      sb-emulator:
        aliases:
          - "sb-emulator"
  sqledge:
    container_name: "sqledge"
    image: "mcr.microsoft.com/azure-sql-edge:latest"
    networks:
      sb-emulator:
        aliases:
          - "sqledge"
    environment:
      ACCEPT_EULA: Y
      MSSQL_SA_PASSWORD: Adm1n!@2123
networks:
  sb-emulator: 

测试代码

public static void main(String[] args) {
    String CONNECTION_STRING ="Endpoint=sb://localhost;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=SAS_KEY_VALUE;UseDevelopmentEmulator=true;";
    ServiceBusAdministrationClient serviceBusAdministrationClient = new ServiceBusAdministrationClientBuilder()
            .connectionString(CONNECTION_STRING).buildClient();
    boolean subscriptionExists = serviceBusAdministrationClient.getSubscriptionExists("topic.1", "subscription.1");
    System.out.println("Subscription exists: " + subscriptionExists);
}

报错信息

Exception in thread "main" java.io.UncheckedIOException: io.netty.channel.AbstractChannel$AnnotatedConnectException: Connection refused: localhost/[0:0:0:0:0:0:0:1]:443


问题修复方案

1. 自定义Config.json未读取的修复

当前Docker Compose的volumes配置仅创建了匿名卷,未将本地文件映射到容器内的正确路径。Service Bus Emulator容器内默认读取/home/servicebus/config/Config.json,需修改volumes配置为:

volumes:
  - ./Config.json:/home/servicebus/config/Config.json

确保本地Config.json与docker-compose.yml在同一目录,或使用绝对路径指定本地文件位置。

2. Connection refused:443错误的修复

报错原因是客户端尝试通过HTTPS(443端口)连接,但容器未暴露该端口,且模拟器默认使用HTTP协议。需调整以下几点:

  • 修改连接字符串:显式指定管理端口9354,并添加传输类型配置:
    String CONNECTION_STRING = "Endpoint=sb://localhost:9354;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=SAS_KEY_VALUE;UseDevelopmentEmulator=true;TransportType=AmqpWebSockets;";
    
  • 检查端口占用:用netstat -ano | findstr :9354(Windows)或lsof -i :9354(Linux/Mac)确认9354端口未被其他进程占用。
  • 优化容器启动顺序:添加健康检查确保SQL Edge就绪后再启动模拟器,避免初始化失败:
    services:
      emulator:
        # 其他配置不变
        healthcheck:
          test: ["CMD-SHELL", "/opt/mssql-tools/bin/sqlcmd -S sqledge -U sa -P Adm1n!@2123 -Q 'SELECT 1' || exit 1"]
          interval: 10s
          timeout: 5s
          retries: 5
        depends_on:
          sqledge:
            condition: service_healthy
    

内容的提问来源于stack exchange,提问作者Oded Kessler

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 01:47:20