使用Java获得Azure listblob的最佳方法是什么?



大家好。我在Java 8中使用com.azure:azure-storage-blob依赖项。我对这个项目的表现有一个问题。获取所有blobs:

BlobServiceClient client = new BlobServiceClientBuilder()
.connectionString("connectionString")
.buildClient();
client.getBlobContainerClient("containerName")
.listBlobs(new ListBlobsOptions().setPrefix("prefix"), null)
.stream()...

代码段工作得很好,但是如果我需要设置一个时间限制而不是null,那么错误开始出现:

Exception in thread "main" reactor.core.Exceptions$ReactiveException: java.util.concurrent.TimeoutException: Did not observe any item or terminal signal within 1000ms in 'flatMap' (and no fallback has been configured)

底线是,我需要读取对象组并发送它们进行进一步处理,而不是等待所有对象。因为10个对象的等待时间肯定小于10000。我知道有continuationToken,但是在返回的集合上调用它会抛出上面提到的异常。是否存在最优解?提前感谢

要了解有关错误的完整详细信息,请尝试启用存储日志并检查日志

使用下面来自MsDoc的示例代码:

ListBlobsOptions options = new ListBlobsOptions()
.setPrefix("prefixToMatch")
.setDetails(new BlobListDetails()
.setRetrieveDeletedBlobs(true)
.setRetrieveSnapshots(true));
String continuationToken = "continuationToken";
client.listBlobs(options, continuationToken, timeout).forEach(blob ->
System.out.printf("Name: %s, Directory? %b, Deleted? %b, Snapshot ID: %s%n",
blob.getName(),
blob.isPrefix(),
blob.isDeleted(),
blob.getSnapshot()));

否则,利用Duration.ofMinutes()在你的代码中,如下所示:

Duration duration = Duration.ofMinutes(2);
containerClient.listBlobs(options, duration)

如果错误仍然发生,尝试更改Azure Java SDK的版本。

参考:

c# -设置Azure存储操作的超时时间-堆栈溢出

Azure azure-sdk-for-java/问题/15215

相关内容

最新更新