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 iPagedFlux
ułatwia iterowanie w przypadku deserializacji odpowiedzi podzielonej na strony w danym typieT
.PagedIterable
implementujeIterable
interfejs i oferuje interfejs API do odbieraniaStream
elementu , a elementPagedFlux
udostępnia elementFlux
. 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
metodyPagedFlux
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 Iterable
element , 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
element , 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 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ż 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.