Scala使用com.azure.storage.blob包下载Blob报ClosedChannelException错误
问题根因与解决方案
首要错误点
你将完整Blob访问URL直接传入了BlobClientBuilder的endpoint参数,不符合SDK参数规则:endpoint仅需填写存储账号的根服务地址,容器名、Blob路径需要通过单独的方法指定,错误的地址解析会导致服务端主动断开连接,抛出java.nio.channels.ClosedChannelException。
修正后可运行代码
import com.azure.identity.AzureCliCredentialBuilder import com.azure.storage.blob.BlobClientBuilder // 仅填存储账号根端点 val storageAccountEndpoint = "https://<storage_account>.blob.core.windows.net/" val containerName = "<container>" val blobFullPath = "<path>/application.conf" val cred = new AzureCliCredentialBuilder().build() val blobClient = new BlobClientBuilder() .endpoint(storageAccountEndpoint) .containerName(containerName) .blobName(blobFullPath) .credential(cred) .buildClient() // 直接调用downloadContent即可,无需额外转BlockBlobClient val content = blobClient.downloadContent()
其他场景排查方案
如果按上述修改后仍报错,按以下顺序排查:
- 依赖版本校验:确保所有Azure SDK相关依赖版本一致,且已引入
azure-core-http-netty传输依赖,排除Reactor、Netty包版本冲突导致的底层链路异常。 - 超时配置调整:网络环境不稳定或下载大体积Blob时,可自定义HttpClient调大超时阈值:
import com.azure.core.http.netty.NettyAsyncHttpClientBuilder import java.time.Duration val customHttpClient = new NettyAsyncHttpClientBuilder() .responseTimeout(Duration.ofMinutes(2)) .build() // 构造BlobClient时传入自定义HttpClient val blobClient = new BlobClientBuilder() .endpoint(storageAccountEndpoint) .containerName(containerName) .blobName(blobFullPath) .credential(cred) .httpClient(customHttpClient) .buildClient() - 代理配置适配:如果运行环境存在内网代理、系统代理,需要在HttpClient配置中显式传入代理参数,避免中间节点强制断开链路。
内容的提问来源于stack exchange,提问作者Traber
相关产品推荐
相关产品推荐

