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
相关产品推荐
相关产品推荐

