Мне нужно перечислить все большие двоичные объекты в контейнере Azure Blobstorage. Контейнер содержит около 200000 ~ больших двоичных объектов, и я хочу получить имя большого двоичного объекта, дату последнего изменения и размер большого двоичного объекта.
Следуя документации для Azure Java SDK V12 , следующий код должен работать:
BlobServiceClient blobServiceClient = new BlobServiceClientBuilder().connectionString(AzureBlobConnectionString).buildClient();
String containerName = "container1";
BlobContainerClient containerClient = blobServiceClient.getBlobContainerClient(containerName);
System.out.println("\nListing blobs...");
// List the blob(s) in the container.
for (BlobItem blobItem : containerClient.listBlobs()) {
System.out.println("\t" + blobItem.getName());
}
Однако при запуске это приложение просто зависает на неопределенный срок. Если я открою Powershell и выполню следующую команду:
Get-AzStorageBlob -Container container1 -Context $ctx
, я получу ожидаемый результат примерно через 3 минуты.
Я дал пример кода для выполнения более часа, но пока из этого ничего не выходит. Я попытался ограничить запрашиваемые данные в соответствии с документацией, а также установить 5-минутный тайм-аут:
BlobServiceClient blobServiceClient = new BlobServiceClientBuilder().connectionString(AzureBlobConnectionString).buildClient();
String containerName = "container1";
BlobContainerClient containerClient = blobServiceClient.getBlobContainerClient(containerName);
System.out.println("\nListing blobs...");
ListBlobsOptions options = new ListBlobsOptions()
.setMaxResultsPerPage(10)
.setDetails(new BlobListDetails()
.setRetrieveDeletedBlobs(false)
.setRetrieveSnapshots(true));
Duration duration = Duration.ofMinutes(5);
containerClient.listBlobs(options, duration).forEach(blob ->
System.out.printf("Name: %s, Directory? %b, Deleted? %b, Snapshot ID: %s%n",
blob.getName(),
blob.isPrefix(),
blob.isDeleted(),
blob.getSnapshot()));
Однако это привело к его истечению с исключением:
Exception in thread "main" reactor.core.Exceptions$ReactiveException: java.util.concurrent.TimeoutException: Did not observe any item or terminal signal within 300000ms in 'flatMap' (and no fallback has been configured)
at reactor.core.Exceptions.propagate(Exceptions.java:366)
at reactor.core.publisher.BlockingIterable$SubscriberIterator.hasNext(BlockingIterable.java:168)
at java.lang.Iterable.forEach(Iterable.java:74)
at AzureManagement.AzureControl.listAllBlobs(AzureControl.java:42)
at Main.main(Main.java:8)
Насколько я понимаю, раньше существовал метод под названием "listBlobsSegmented", однако его нет в версии V12 Azure SDK для Java.
Если у кого-то есть идеи, как получить список капель в контейнере эффективным и действенным образом Я был бы очень признателен!
Спасибо.