本地Java开发连接Azure Cosmos DB Emulator报错如何解决?
问题背景
- 开发场景:基于Java开发定时下载XML并存储到Cosmos DB的Azure Function,本地使用VS Code开发,配套Cosmos DB Emulator做本地调试
- 实例化CosmosClient的代码如下:
private static CosmosClient cosmosClient = new CosmosClientBuilder().endpoint("https://localhost:8081") .key("C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw==").consistencyLevel(ConsistencyLevel.EVENTUAL).buildClient();
- 故障表现:代码可正常启动,执行
buildClient()方法后会生成大量线程最终触发报错,报错截图如下:
- 疑问:所用endpoint和密钥均来自Cosmos DB Emulator官方提供的默认值,错误根源是什么,是否需要额外凭证?
问题根因
证书导入路径不匹配:按照官方指南操作时,误将Azure Cosmos Emulator的证书导入到了全局JVM的密钥库,但系统环境变量中配置的Java运行时是当前用户维度的JVM副本,导致程序请求模拟器时SSL签名校验失败,触发底层连接重试逻辑生成大量线程。
修复步骤
- 先确认当前Java项目使用的运行时路径:可在VS Code的「Java: Configure Java Runtime」面板中查看当前项目绑定的JDK安装目录
- 导出Cosmos DB Emulator的安全根证书,可直接在模拟器的Web管理界面导出,也可通过Windows证书管理器导出本地信任的模拟器根证书
- 使用对应JDK目录下的
keytool工具,将导出的证书导入到该JDK的jre/lib/security/cacerts密钥库中,执行导入命令时注意需要管理员权限 - 重启Cosmos DB Emulator和VS Code后重新运行项目即可恢复正常
内容的提问来源于stack exchange,提问作者JamaicaBot
相关产品推荐
相关产品推荐

