I found a solution for this issue. When I use Azure Api directly and
operate with Page all works. It is useful when your azure blob storage
contains a lot of blobs (in my case ~250k).

from("direct:list")
        .routeId("listBlobs")
        .process(exchange -> {
          BlobServiceClient blobServiceClient = new
BlobServiceClientBuilder()
              .endpoint(String
                  .format("https://%s.blob.core.windows.net";,
AzureBlobConfigHelper.ACCOUNT))
              .credential(new
StorageSharedKeyCredential(AzureBlobConfigHelper.ACCOUNT,
                  AzureBlobConfigHelper.ACCESS_KEY))
              .buildClient();
          BlobContainerClient containerClient =

blobServiceClient.getBlobContainerClient(AzureBlobConfigHelper.BLOB_CONTAINER_NAME);
          ListBlobsOptions blobsOptions = new
ListBlobsOptions().setMaxResultsPerPage(5);
          Duration duration = Duration.of(10, ChronoUnit.SECONDS);

          Iterator<BlobItem>
              iterator = containerClient.listBlobs(blobsOptions,
duration).iterator();
          exchange.getIn().setBody(iterator);
        })
        .loopDoWhile(exchange -> {
          Iterator<BlobItem> iterator =
              (Iterator<BlobItem>) exchange.getIn().getBody(Iterator.class);
          return iterator.hasNext();
        })
        .process(exchange -> {
          Iterator<BlobItem> iterator =
              (Iterator<BlobItem>) exchange.getIn().getBody(Iterator.class);
          exchange.getIn().setBody(iterator.next());
        })
        .process(exchange -> {
          BlobItem item = exchange.getIn().getBody(BlobItem.class);
          log.info(item);
        })
        .end();

On Tue, 26 Jan 2021 at 13:57, Omar Al-Safi <[email protected]> wrote:

> Hi,
>
> Actually you are doing nothing wrong here. Apparently when you set
> maxResultsPerPage, in Azure client, that means it will return pageable
> list, now in every pagelist it will return the max blobs that you set
> earlier in `maxResultsPerPage` which is IMO pretty weird from Azure's side.
> Now in the Camel component side, we just collect all that list of blobs in
> the pages into one list and return that in the body and hence the reason
> why you see no effects. I hope Azure will improve the API in the future to
> allow alternative options as max results regardless of the pageable list.
>
> Regards,
> Omar
>
> On Mon, Jan 25, 2021 at 8:04 PM Mark Andreev <[email protected]>
> wrote:
>
> > Hi, I use Spring 2.4.2 with camel-azure-storage-blob 3.7.0.
> >
> > When I set BlobConstants.LIST_BLOB_OPTIONS as "new
> > ListBlobsOptions().setMaxResultsPerPage(5)" driver returns all entities
> > from blob.
> >
> > from("direct:list")
> > .routeId("listBlobs")
> > .setHeader(BlobConstants.LIST_BLOB_OPTIONS)
> >
> > .constant(new ListBlobsOptions().setMaxResultsPerPage(5))
> > .to(
> > String.format(
> > "
> >
> >
> azure-storage-blob://%s/%s?accessKey=RAW(%s)&operation=listBlobs&synchronous=true
> > ",
> > ACCOUNT,
> > BLOB_CONTAINER_NAME,
> > ACCESS_KEY
> > )
> > )
> > .process(exchange -> {
> > int itemsCount = exchange.getIn().getBody(List.class).size();
> > log.info(String.format("Items count = '%d'", itemsCount));
> > });
> >
> > How should I use this API to fetch only 5 items?
> >
> > Full example:
> >
> >
> https://github.com/mrk-andreev/example-camel-azure-blob-pagination-bug/blob/master/src/main/java/name/mrkandreev/camel/MyApplication.java
> > --
> > Best regards,
> > Mark Andreev
> >
>


-- 
Best regards,
Mark Andreev

Reply via email to