【问题标题】:BlobContainerClient - Azure Storage - Java SDK (12.14.2) - method listBlobs maxResults and paginationBlobContainerClient - Azure 存储 - Java SDK (12.14.2) - 方法 listBlobs maxResults 和分页
【发布时间】:2022-01-05 21:09:42
【问题描述】:

通过 Java SDK (azure-spring-boot-starter-storage) 迭代 Azure 存储中的可用 blob 不适用于 maxresults 查询参数。

ListBlobsOptions listBlobsOptions= new ListBlobsOptions()
    .setDetails(new BlobListDetails()
        .setRetrieveDeletedBlobs(false)
        .setRetrieveSnapshots(false))
    .setMaxResultsPerPage(pageSize);

blobContainerClient.listBlobs(listBlobsOptions, continuationToken, Duration.ofSeconds(3));

listBlobs 方法有效并返回所有可用的BlobItems 作为PagedIterable。理想情况下,它应该在标记通过 setMaxResultsPerPage 方法获取请求中传递的 maxresults 查询参数时停止。

自动生成一个标记,并由 SDK 发送一个新请求以获取下一个结果。最后,所有可用的 Blob 都从 Azure 存储返回,而不是分页 Blob 列表。

例如SDK GET 自动创建的请求{uri=/containername?restype=container&comp=list&marker=...&maxresults=1

如何使用同步 BlobServiceClient 进行分页?

【问题讨论】:

    标签: java spring-boot azure-blob-storage


    【解决方案1】:

    解决方法尝试以下解决方案

    解决方案 1): 尝试使用Listblobssegmented() 方法。

    ListBlobsSegmented 包含maxResults 参数。

    ma​​xResults:一个非负整数值,表示一次返回的最大结果数,最多为每次操作的限制 5000。如果此值为 null,则最大将返回可能的结果数,最多 5000 个。

    注意:如果有更多的 blob 可用,那么您将获得一个可用于获取下一组 blob 的延续令牌。这个延续标记可以在响应正文的元素中找到。

    解决方案 2:尝试使用 java 和最新的 MS azure 进行代码分页

    Void listAllForContainer(BlobContainerClient container) {
        String token = null;
        do {
            PagedResponse<BlobItem> pr = container
                    .listBlobs(options, token, Duration.ofSeconds(60))
                    .iterableByPage()
                    .iterator()
                    .next();
    
            token = pr.getContinuationToken();
            List<BlobItem> pageItems = pr.getValue();
            pageItems.forEach(i->System.out.println(i.getName()));
    
        } while (token != null);
    }
    

    更多详情请参考SO Thread

    【讨论】:

    • 即使您看到原始请求与解决方案#1 相同,在发送给 MS 的每个请求中都包含 maxresults @QueryParam。来自 MS 的响应也是分页的,但实际问题是顺序请求已通过 SDK 发送,而它应该已停止
    • Solution#2 对我来说似乎是合理的,但首先它提供了一个后处理视图,这确实意味着一旦 listBlobs 收集了完整的响应,然后您就可以在页面上进行迭代
    猜你喜欢
    • 2020-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-08
    • 2021-08-15
    • 2015-01-31
    • 1970-01-01
    • 2016-08-08
    相关资源
    最近更新 更多