Paginierung und Iteration im Azure SDK für Java
Dieser Artikel bietet einen Überblick darüber, wie Sie das Azure SDK für die Java-Funktionen zur Paginierung und Iteration verwenden können, um effizient und produktiv mit großen Datasets zu arbeiten.
Viele der von den Clientbibliotheken im Azure Java SDK bereitgestellten Vorgänge geben mehr als ein Ergebnis zurück. Das Azure Java SDK definiert einen Satz akzeptabler Rückgabetypen in diesen Fällen, um sicherzustellen, dass die Entwicklererfahrung durch Konsistenz optimiert wird. Die verwendeten Rückgabetypen sind PagedIterable
für synchrone APIs und PagedFlux
für asynchrone APIs. Die APIs unterscheiden sich leicht hinsichtlich ihrer unterschiedlichen Anwendungsfälle, besitzen aber konzeptionell dieselben Anforderungen:
Ermöglichen der einfachen Iteration über jedes einzelne Element in der Sammlung, wobei jegliche Erfordernis von manueller Paginierung oder Nachverfolgung von Fortsetzungstoken ignoriert wird. Sowohl
PagedIterable
als auchPagedFlux
erleichtern diese Aufgabe, indem die Iteration über eine paginierte Antwort erfolgt, die in den angegebenen TypT
deserialisiert wurde.PagedIterable
implementiert dieIterable
-Schnittstelle und bietet eine API zum Abrufen einesStream
, währendPagedFlux
einenFlux
bietet. In allen Fällen ist der Vorgang der Paginierung transparent, und die Iteration wird fortgesetzt, während noch Ergebnisse vorhanden sind, die noch iteriert werden müssen.Ermöglichen der explizit seitenweisen Iteration. Hierdurch können Sie besser verstehen, wann Anforderungen gestellt werden, und Sie können auf Antwortinformationen pro Seite zugreifen. Sowohl
PagedIterable
als auchPagedFlux
besitzen Methoden, die Typen zurückgeben, die für die seitenweise Iteration geeignet sind, anstatt über einzelne Elemente.
Dieser Artikel ist aufgeteilt zwischen den synchronen und asynchronen APIs des Java Azure SDK. Die synchronen Iterations-APIs sehen Sie, wenn Sie mit synchronen Clients arbeiten, und die asynchronen Iterations-APIs, wenn Sie mit asynchronen Clients arbeiten.
In diesem Abschnitt werden die synchronen APIs behandelt.
Wie bereits erwähnt, besteht der gängigste Anwendungsfall in der Iteration über jedes einzelne Element, anstatt seitenweise. Die folgenden Codebeispiele veranschaulichen, wie Ihnen die PagedIterable
-API gestattet, Ihren bevorzugten Iterationstyp zu verwenden, um diese Funktionalität zu implementieren.
Da PagedIterable
Iterable
implementiert, können Sie durch alle Elemente iterieren, wie im folgenden Beispiel gezeigt:
PagedIterable<Secret> secrets = client.listSecrets();
for (Secret secret : secrets) {
System.out.println("Secret is: " + secret);
}
Da für PagedIterable
eine stream()
-Methode definiert ist, können Sie diese aufrufen, um die Standardstream-APIs von Java zu verwenden, wie im folgenden Beispiel gezeigt:
client.listSecrets()
.stream()
.forEach(secret -> System.out.println("Secret is: " + secret));
Da PagedIterable
Iterable
implementiert, besitzt es auch eine iterator()
-Methode, die den Iterator-Programmierstil von Java ermöglicht, wie im folgenden Beispiel gezeigt:
Iterator<Secret> secrets = client.listSecrets().iterator();
while (it.hasNext()) {
System.out.println("Secret is: " + it.next());
}
Wenn Sie mit einzelnen Seiten arbeiten, können Sie seitenweise iterieren, z. B. wenn Sie HTTP-Antwortinformationen benötigen, oder wenn Fortsetzungstoken wichtig sind, um den Verlauf zu erhalten. Unabhängig davon, ob Sie seitenweise oder elementweise iterieren, gibt es bei der Leistung oder der Anzahl der vom Dienst ausgeführten Aufrufe keinen Unterschied. Die zugrunde liegende Implementierung lädt die nächste Seite auf Anforderung, und wenn Sie das Abonnement von PagedFlux
kündigen, was jederzeit möglich ist, erfolgen keine weiteren Aufrufe an den Dienst.
Wenn Sie listSecrets()
aufrufen, erhalten Sie ein PagedIterable
, das eine iterableByPage()
-API besitzt. Diese API erzeugt eine Iterable<PagedResponse<Secret>>
anstelle eines Iterable<Secret>
. Die PagedResponse
bietet die Antwortmetadaten sowie Zugriff auf das Fortsetzungstoken, wie im folgenden Beispiel gezeigt:
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))
}
Außerdem gibt es eine iterableByPage
-Überladung, die ein Fortsetzungstoken akzeptiert. Sie können diese Überladung aufrufen, wenn Sie zu einem späteren Zeitpunkt zum selben Punkt in der Iteration zurückkehren möchten.
Im folgenden Beispiel wird gezeigt, wie die streamByPage()
-Methode denselben Vorgang wie den oben gezeigten ausführt. Diese API verfügt auch über eine Fortsetzungstokenüberladung, um zu einem späteren Zeitpunkt zum selben Punkt in der Iteration zurückzukehren.
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))
});
In diesem Abschnitt werden die asynchronen APIs behandelt. Bei asynchronen APIs erfolgen die Netzwerkaufrufe in einem anderen Thread als dem Hauptthread, der subscribe()
aufruft. Dies bedeutet, dass der Hauptthread beendet werden kann, bevor das Ergebnis verfügbar ist. Es liegt an Ihnen sicherzustellen, dass die Anwendung nicht beendet wird, bevor der asynchrone Vorgang beendet werden konnte.
Das folgende Beispiel zeigt, wie Sie mit der PagedFlux
-API einzelne Elemente asynchron beobachten können. Es gibt verschiedene Möglichkeiten, um einen Flux-Typ zu abonnieren. Weitere Informationen finden Sie unter Einfache Möglichkeiten zum Erstellen eines Flux oder Mono und zu dessen Abonnierung im Reaktor 3-Referenzhandbuch. Bei diesem Beispiel handelt es sich um eine Variante, bei der drei Lambdaausdrücke vorhanden sind, jeweils einer für den Consumer, für den Fehlerconsumer und den Abschlussconsumer. Es ist bewährte Praxis, alle drei zu verwenden, doch in manchen Fällen ist es nur notwendig, den Consumer und vielleicht noch den Fehlerconsumer zu verwenden.
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"));
Das folgende Beispiel zeigt, wie Sie mit der PagedFlux
-API jede Seite asynchron beobachten können, wiederum durch Verwendung einer byPage()
-API und durch Bereitstellen eines Consumers, Fehlerconsumers und Abschlussconsumers.
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"));
Nachdem Sie nun mit Paginierung und Iteration im Azure ADK für Java vertraut sind, sollten Sie Zeitintensive Vorgänge im Azure SDK für Java lesen. Zeitintensive Vorgänge sind Vorgänge, deren Ausführung länger dauert, als die der meisten normalen HTTP-Anforderungen, normalerweise, weil der Aufwand auf Serverseite höher ist.