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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 03:06:03