Udostępnij za pośrednictwem


Stronicowanie i iteracja w zestawie Azure SDK dla języka Java

Ten artykuł zawiera omówienie sposobu korzystania z zestawu Azure SDK dla języka Java stronicowania i iteracji w celu wydajnej i wydajnej pracy z dużymi zestawami danych.

Wiele operacji udostępnianych przez biblioteki klienckie w zestawie Azure Java SDK zwraca więcej niż jeden wynik. Zestaw Sdk języka Java platformy Azure definiuje zestaw akceptowalnych typów zwracanych w tych przypadkach, aby zapewnić zmaksymalizowanie środowiska dewelopera dzięki spójności. Używane typy zwracane są PagedIterable dla interfejsów API synchronizacji i PagedFlux dla asynchronicznych interfejsów API. Interfejsy API różnią się nieco w zależności od ich różnych przypadków użycia, ale koncepcyjnie mają te same wymagania:

  • Umożliwia łatwe iterowanie poszczególnych elementów w kolekcji indywidualnie, ignorując konieczność ręcznego stronicowania lub śledzenia tokenów kontynuacji. Zarówno PagedIterable zadanie, jak i PagedFlux ułatwia iterowanie w przypadku deserializacji odpowiedzi podzielonej na strony w danym typie T. PagedIterable implementuje Iterable interfejs i oferuje interfejs API do odbierania Streamelementu , a element PagedFlux udostępnia element Flux. We wszystkich przypadkach działanie stronicowania jest przezroczyste, a iteracja jest kontynuowana, gdy nadal są wyniki iteracji.

  • Umożliwia jawne iterowanie strony po stronie. Dzięki temu można lepiej zrozumieć, kiedy są wykonywane żądania, i umożliwia dostęp do informacji o odpowiedzi na strony. Obie PagedIterable metody PagedFlux i mają metody, które zwracają odpowiednie typy, aby iterować według strony, a nie według poszczególnych elementów.

Ten artykuł jest podzielony między synchroniczne i asynchroniczne interfejsy API zestawu Azure SDK dla języka Java. Interfejsy API iteracji synchronicznej będą widoczne podczas pracy z klientami synchronicznymi i asynchronicznymi interfejsami API iteracji podczas pracy z klientami asynchronicznymi.

Synchroniczne stronicowanie i iteracja

W tej sekcji omówiono synchroniczne interfejsy API.

Iterowanie poszczególnych elementów

Jak wspomniano, najczęstszym przypadkiem użycia jest iteracja poszczególnych elementów zamiast na stronę. W poniższych przykładach kodu pokazano, jak PagedIterable interfejs API umożliwia użycie stylu iteracji, który chcesz zaimplementować w celu zaimplementowania tej funkcji.

Używanie pętli for-each

Ponieważ PagedIterable implementuje Iterableelement , można iterować po elementach, jak pokazano w poniższym przykładzie:

PagedIterable<Secret> secrets = client.listSecrets();
for (Secret secret : secrets) {
   System.out.println("Secret is: " + secret);
}

Korzystanie z usługi Stream

Ponieważ PagedIterable ma zdefiniowaną na nim metodę stream() , można ją wywołać, aby używać standardowych interfejsów API usługi Java Stream, jak pokazano w poniższym przykładzie:

client.listSecrets()
      .stream()
      .forEach(secret -> System.out.println("Secret is: " + secret));

Korzystanie z iteratora

Ponieważ PagedIterable implementuje Iterableelement , ma również metodę iterator() zezwalania na styl programowania iteratora Java, jak pokazano w poniższym przykładzie:

Iterator<Secret> secrets = client.listSecrets().iterator();
while (it.hasNext()) {
   System.out.println("Secret is: " + it.next());
}

Iterowanie na stronach

Podczas pracy z poszczególnymi stronami można iterować na stronę, na przykład gdy potrzebne są informacje o odpowiedzi HTTP lub gdy tokeny kontynuacji są ważne, aby zachować historię iteracji. Niezależnie od tego, czy iterujesz według strony, czy poszczególnych elementów, nie ma różnicy w wydajności lub liczbie wywołań wykonanych w usłudze. Podstawowa implementacja ładuje następną stronę na żądanie, a jeśli anulujesz subskrypcję w PagedFlux dowolnym momencie, nie ma dalszych wywołań usługi.

Używanie pętli for-each

Po wywołaniu listSecrets()metody otrzymasz PagedIterableelement , który ma iterableByPage() interfejs API. Ten interfejs API tworzy element Iterable<PagedResponse<Secret>> zamiast Iterable<Secret>. Element PagedResponse udostępnia metadane odpowiedzi i dostęp do tokenu kontynuacji, jak pokazano w poniższym przykładzie:

Iterable<PagedResponse<Secret>> secretPages = client.listSecrets().iterableByPage();
for (PagedResponse<Secret> page : secretPages) {
   System.out.println("Response code: " + page.getStatusCode());
   System.out.println("Continuation Token: " + page.getContinuationToken());
   page.getElements().forEach(secret -> System.out.println("Secret value: " + secret))
}

Istnieje również iterableByPage przeciążenie, które akceptuje token kontynuacji. To przeciążenie można wywołać, gdy chcesz wrócić do tego samego punktu iteracji w późniejszym czasie.

Korzystanie z usługi Stream

W poniższym przykładzie pokazano, jak streamByPage() metoda wykonuje tę samą operację, jak pokazano powyżej. Ten interfejs API ma również przeciążenie tokenu kontynuacji do powrotu do tego samego punktu iteracji w późniejszym czasie.

client.listSecrets()
      .streamByPage()
      .forEach(page -> {
          System.out.println("Response code: " + page.getStatusCode());
          System.out.println("Continuation Token: " + page.getContinuationToken());
          page.getElements().forEach(secret -> System.out.println("Secret value: " + secret))
      });

Asynchronicznie obserwuj strony i poszczególne elementy

W tej sekcji omówiono asynchroniczne interfejsy API. W asynchronicznych interfejsach API wywołania sieciowe są wykonywane w innym wątku niż główny wątek, który wywołuje metodę subscribe(). Oznacza to, że główny wątek może zakończyć się przed udostępnieniem wyniku. Należy upewnić się, że aplikacja nie kończy działania przed ukończeniem operacji asynchronicznych.

Obserwowanie poszczególnych elementów

W poniższym przykładzie PagedFlux pokazano, jak interfejs API umożliwia asynchroniczne obserwowanie poszczególnych elementów. Istnieją różne sposoby subskrybowania typu Flux. Aby uzyskać więcej informacji, zobacz Simple Ways to Create a Flux or Mono and Subscribe to It in the Reactor 3 Reference Guide (Proste sposoby tworzenia strumienia lub mono i subskrybowania go w przewodniku referencyjnym reactor 3). Ten przykład jest jedną odmianą, w której istnieją trzy wyrażenia lambda, po jednym dla konsumenta, konsument błędu i kompletny konsument. Posiadanie wszystkich trzech jest dobrym rozwiązaniem, ale w niektórych przypadkach konieczne jest posiadanie konsumenta i ewentualnie konsumenta błędu.

asyncClient.listSecrets()
   .subscribe(secret -> System.out.println("Secret value: " + secret),
       ex -> System.out.println("Error listing secrets: " + ex.getMessage()),
       () -> System.out.println("Successfully listed all secrets"));

Obserwowanie stron

W poniższym przykładzie pokazano, jak PagedFlux interfejs API umożliwia obserwowanie każdej strony asynchronicznie, przy użyciu interfejsu byPage() API oraz dostarczanie konsumenta, odbiorcy błędów i odbiorcy uzupełniania.

asyncClient.listSecrets().byPage()
  .subscribe(page -> {
          System.out.println("Response code: " + page.getStatusCode());
          System.out.println("Continuation Token: " + page.getContinuationToken());
          page.getElements().forEach(secret -> System.out.println("Secret value: " + secret))
      },
      ex -> System.out.println("Error listing pages with secret: " + ex.getMessage()),
      () -> System.out.println("Successfully listed all pages with secret"));

Następne kroki

Teraz, gdy znasz stronicowanie i iterację w zestawie Azure SDK dla języka Java, rozważ przejrzenie długotrwałych operacji w zestawie Azure SDK dla języka Java. Długotrwałe operacje to operacje, które działają przez dłuższy czas niż większość normalnych żądań HTTP, zazwyczaj dlatego, że wymagają pewnego nakładu pracy po stronie serwera.