Class PagedFlux<T>

Type Parameters:
T - The type of items in a PagedResponse
All Implemented Interfaces:
org.reactivestreams.Publisher<T>, CorePublisher<T>

public class PagedFlux<T> extends PagedFluxBase<T,PagedResponse<T>>
PagedFlux is a Flux that provides the ability to operate on paginated REST responses of type PagedResponse and individual items in such pages. When processing the response by page each response will contain the items in the page as well as the REST response details such as status code and headers.

To process one item at a time, simply subscribe to this flux as shown below

Code sample

 // Subscribe to process one item at a time
 pagedFlux
     .log()
     .subscribe(item -> System.out.println("Processing item with value: " + item),
         error -> System.err.println("An error occurred: " + error),
         () -> System.out.println("Processing complete."));
 

To process one page at a time, use PagedFluxBase.byPage() method as shown below

Code sample

 // Subscribe to process one page at a time from the beginning
 pagedFlux
     .byPage()
     .log()
     .subscribe(page -> System.out.printf("Processing page containing item values: %s%n",
         page.getElements().stream().map(String::valueOf).collect(Collectors.joining(", "))),
         error -> System.err.println("An error occurred: " + error),
         () -> System.out.println("Processing complete."));
 

To process items one page at a time starting from any page associated with a continuation token, use PagedFluxBase.byPage(String) as shown below

Code sample

 // Subscribe to process one page at a time starting from a page associated with
 // a continuation token
 String continuationToken = getContinuationToken();
 pagedFlux
     .byPage(continuationToken)
     .log()
     .doOnSubscribe(ignored -> System.out.println(
         "Subscribed to paged flux processing pages starting from: " + continuationToken))
     .subscribe(page -> System.out.printf("Processing page containing item values: %s%n",
         page.getElements().stream().map(String::valueOf).collect(Collectors.joining(", "))),
         error -> System.err.println("An error occurred: " + error),
         () -> System.out.println("Processing complete."));
 
See Also:
  • Constructor Details

    • PagedFlux

      public PagedFlux(Supplier<Mono<PagedResponse<T>>> firstPageRetriever)
      Creates an instance of PagedFlux that consists of only a single page. This constructor takes a Supplier that return the single page of T.

      Code sample

       // A supplier that fetches the first page of data from source/service
       Supplier<Mono<PagedResponse<Integer>>> firstPageRetrieverFunction = () -> getFirstPage();
      
       PagedFlux<Integer> pagedFluxInstance = new PagedFlux<>(firstPageRetrieverFunction,
           nextPageRetriever);
       
      Parameters:
      firstPageRetriever - Supplier that retrieves the first page.
    • PagedFlux

      public PagedFlux(Function<Integer,Mono<PagedResponse<T>>> firstPageRetriever)
      Creates an instance of PagedFlux that consists of only a single page with a given element count.

      Code sample

       // A function that fetches the single page of data from a source/service.
       Function<Integer, Mono<PagedResponse<Integer>>> singlePageRetriever = pageSize ->
           getFirstPageWithSize(pageSize);
      
       PagedFlux<Integer> singlePageFluxWithPageSize = new PagedFlux<Integer>(singlePageRetriever);
       
      Parameters:
      firstPageRetriever - Function that retrieves the first page.
    • PagedFlux

      public PagedFlux(Supplier<Mono<PagedResponse<T>>> firstPageRetriever, Function<String,Mono<PagedResponse<T>>> nextPageRetriever)
      Creates an instance of PagedFlux. The constructor takes a Supplier and Function. The Supplier returns the first page of T, the Function retrieves subsequent pages of T.

      Code sample

       // A supplier that fetches the first page of data from source/service
       Supplier<Mono<PagedResponse<Integer>>> firstPageRetriever = () -> getFirstPage();
      
       // A function that fetches subsequent pages of data from source/service given a continuation token
       Function<String, Mono<PagedResponse<Integer>>> nextPageRetriever =
           continuationToken -> getNextPage(continuationToken);
      
       PagedFlux<Integer> pagedFlux = new PagedFlux<>(firstPageRetriever,
           nextPageRetriever);
       
      Parameters:
      firstPageRetriever - Supplier that retrieves the first page
      nextPageRetriever - Function that retrieves the next page given a continuation token
    • PagedFlux

      public PagedFlux(Function<Integer,Mono<PagedResponse<T>>> firstPageRetriever, BiFunction<String,Integer,Mono<PagedResponse<T>>> nextPageRetriever)
      Creates an instance of PagedFlux that is capable of retrieving multiple pages with of a given page size.

      Code sample

       // A function that fetches the first page of data from a source/service.
       Function<Integer, Mono<PagedResponse<Integer>>> firstPageRetriever = pageSize -> getFirstPageWithSize(pageSize);
      
       // A function that fetches subsequent pages of data from a source/service given a continuation token.
       BiFunction<String, Integer, Mono<PagedResponse<Integer>>> nextPageRetriever = (continuationToken, pageSize) ->
           getNextPageWithSize(continuationToken, pageSize);
      
       PagedFlux<Integer> pagedFluxWithPageSize = new PagedFlux<>(firstPageRetriever, nextPageRetriever);
       
      Parameters:
      firstPageRetriever - Function that retrieves the first page.
      nextPageRetriever - BiFunction that retrieves the next page given a continuation token and page size.
  • Method Details

    • create

      public static <T> PagedFlux<T> create(Supplier<PageRetriever<String,PagedResponse<T>>> provider)
      Creates an instance of PagedFlux backed by a Page Retriever Supplier (provider). When invoked provider should return PageRetriever. The provider will be called for each Subscription to the PagedFlux instance. The Page Retriever can get called multiple times in serial fashion, each time after the completion of the Flux returned from the previous invocation. The final completion signal will be send to the Subscriber when the last Page emitted by the Flux returned by Page Retriever has null continuation token. The provider is useful mainly in two scenarios:
      • To manage state across multiple call to Page Retrieval within the same Subscription.
      • To decorate a PagedFlux to produce new PagedFlux.

      Decoration sample

      
       // Transform a PagedFlux with Integer items to PagedFlux of String items.
       final PagedFlux<Integer> intPagedFlux = createAnInstance();
      
       // PagedResponse<Integer> to PagedResponse<String> mapper
       final Function<PagedResponse<Integer>, PagedResponse<String>> responseMapper
           = intResponse -> new PagedResponseBase<Void, String>(intResponse.getRequest(),
           intResponse.getStatusCode(),
           intResponse.getHeaders(),
           intResponse.getValue()
               .stream()
               .map(intValue -> Integer.toString(intValue)).collect(Collectors.toList()),
           intResponse.getContinuationToken(),
           null);
      
       final Supplier<PageRetriever<String, PagedResponse<String>>> provider = () ->
           (continuationToken, pageSize) -> {
               Flux<PagedResponse<Integer>> flux = (continuationToken == null)
                   ? intPagedFlux.byPage()
                   : intPagedFlux.byPage(continuationToken);
               return flux.map(responseMapper);
           };
       PagedFlux<String> strPagedFlux = PagedFlux.create(provider);
      
       // Create a PagedFlux from a PagedFlux with all exceptions mapped to a specific exception.
       final PagedFlux<Integer> pagedFlux = createAnInstance();
       final Supplier<PageRetriever<String, PagedResponse<Integer>>> eprovider = () ->
           (continuationToken, pageSize) -> {
               Flux<PagedResponse<Integer>> flux = (continuationToken == null)
                   ? pagedFlux.byPage()
                   : pagedFlux.byPage(continuationToken);
               return flux.onErrorMap(Exception.class, PaginationException::new);
           };
       final PagedFlux<Integer> exceptionMappedPagedFlux = PagedFlux.create(eprovider);
       
      Type Parameters:
      T - The type of items in a PagedResponse
      Parameters:
      provider - the Page Retrieval Provider
      Returns:
      PagedFlux backed by the Page Retriever Function Supplier
    • mapPage

      @Deprecated public <S> PagedFlux<S> mapPage(Function<T,S> mapper)
      Deprecated.
      refer the decoration samples for create(Supplier).
      Maps this PagedFlux instance of T to a PagedFlux instance of type S as per the provided mapper function.
      Type Parameters:
      S - The mapped type.
      Parameters:
      mapper - The mapper function to convert from type T to type S.
      Returns:
      A PagedFlux of type S.