Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Ten artykuł zawiera omówienie, jak używać funkcji stronicowania i iteracji w Azure SDK dla języka Java, aby efektywnie i produktywnie pracować z dużymi zestawami danych.
Wiele operacji udostępnianych przez biblioteki klienckie w zestawie Azure Java SDK zwraca więcej niż jeden wynik. Azure Java SDK definiuje zbiór akceptowalnych typów zwracanych w tych przypadkach, aby maksymalnie poprawić doświadczenie dewelopera poprzez spójność. Używane typy zwracane to PagedIterable dla synchronizowanych API i PagedFlux dla interfejsów API asynchronicznych. 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
PagedIterablejak iPagedFluxułatwiają realizację tego zadania przez iterowanie po odpowiedzi podzielonej na strony, która została zdeserializowana do zadanego typuT.PagedIterableimplementuje interfejsIterablei oferuje API do odbieraniaStream, aPagedFluxudostępniaFlux. 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 tym działaniom można lepiej zrozumieć, kiedy są składane żądania, oraz ułatwia dostęp do informacji o odpowiedziach dla każdej strony. Zarówno
PagedIterablejak iPagedFluxmają metody, które zwracają odpowiednie typy do iteracji według strony, a nie 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, a interfejsy API iteracji asynchronicznej 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 iterowanie po każdym elemencie, zamiast po stronie. W poniższych przykładach kodu pokazano, jak interfejs API PagedIterable umożliwia użycie stylu iteracji, który preferujesz, do tej funkcjonalności.
Używanie pętli for-each
Ponieważ PagedIterable implementuje Iterable, 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 Iterable, ma również metodę iterator(), aby umożliwić styl programowania iteracji w języku 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 po stronach
Podczas pracy z poszczególnymi stronami można iterować po każdej stronie, na przykład gdy potrzebne są informacje o odpowiedzi HTTP lub gdy tokeny kontynuacji są ważne dla zachowania procesu 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. Implementacja bazowa ładuje następną stronę na żądanie, a jeśli zrezygnujesz z subskrypcji w PagedFlux w dowolnym momencie, nie będzie dalszych wywołań usługi.
Używanie pętli for-each
Po wywołaniu listSecrets() metody otrzymasz PagedIterable element, 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ż mechanizm przeciążenia z wykorzystaniem tokenu kontynuacji, umożliwiający powrót do tego samego punktu iteracji w przyszłości.
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 wątku innym niż główny wątek, który wywołuje 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 to dobra praktyka, ale w niektórych przypadkach konieczne jest posiadanie tylko konsumenta, a ewentualnie także 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 interfejs API PagedFlux umożliwia asynchroniczne monitorowanie każdej strony przez użycie interfejsu API byPage() oraz dostarczenie konsumenta, konsumenta błędów i konsumenta zakończenia.
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"));
Dalsze kroki
Teraz, kiedy już zapoznałeś się z paginacją i iteracją w zestawie SDK usługi Azure dla języka Java, rozważ przejrzenie długotrwałych operacji w zestawie SDK usługi Azure 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.