最后一行很关键:从已配置的服务派生文件系统客户端,而不是再启动一个默认 builder:

var proxy = new ProxyOptions(
    ProxyOptions.Type.HTTP,
    new InetSocketAddress("proxy.example.net", 8080));

var http = new NettyAsyncHttpClientBuilder()
    .proxy(proxy)
    .build();

var credential = new ClientSecretCredentialBuilder()
    .tenantId(tenantId)
    .clientId(clientId)
    .clientSecret(clientSecret)
    .httpClient(http)
    .build();

var service = new DataLakeServiceClientBuilder()
    .endpoint(accountUrl)
    .credential(credential)
    .httpClient(http)
    .buildClient();

var filesystem = service.getFileSystemClient(fileSystemName);

service.getFileSystemClient(fileSystemName) 会把父对象的 HTTP 管线、账户终结点和适用的存储配置带入子对象。

示例把同一个 http 交给凭据 builder,因为获取令牌也是另一条请求路径。单独构建的文件系统客户端同样必须拿到它应有的传输通道;此前的 builder 不会创建全局 SDK 默认值。

请使用应用的账户 URL、文件系统名称和身份值。ProxyOptions 与 Netty 传输类型来自 Azure Core,凭据 builder 来自 Azure Identity,服务 builder 来自 Azure Storage Data Lake;InetSocketAddress 来自 java.net。

accountUrl 仍是存储终结点,文件系统名称则选择子对象。两者都不是代理地址。若存储终结点可公开访问且允许使用公共中介,可从 HTTP 代理列表 中选择 ProxyOptions 的主机和端口;存储与身份设置保持不变。

相关文章