Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.
Travaillez avec des résultats paginés à l'aide de la version 2.x AWS SDK for Java
De nombreuses AWS opérations renvoient des résultats paginés lorsque l'objet de réponse est trop volumineux pour être renvoyé en une seule réponse. Dans la AWS SDK for Java version 1.0, la réponse contient un jeton que vous utilisez pour récupérer la page de résultats suivante. En revanche, la version AWS SDK for Java 2.x dispose de méthodes de pagination automatique qui effectuent plusieurs appels de service pour obtenir automatiquement la page de résultats suivante pour vous. Il vous suffit d'écrire le code qui traite les résultats. La pagination automatique est disponible pour les clients synchrones et asynchrones.
Note
Ces extraits de code supposent que vous comprenez les bases de l'SDKutilisation de et que vous avez configuré votre environnement avec un accès par authentification unique.
Pagination synchrone
Les exemples suivants illustrent les méthodes de pagination synchrone permettant de répertorier les objets d'un Amazon S3 compartiment.
Itérer sur les pages
Le premier exemple montre l'utilisation d'un objet listRes
paginateur, une ListObjectsV2Iterable
stream
Le code circule sur les pages de réponse, convertit le flux de réponse en flux de S3Object
contenu, puis traite le contenu de l' Amazon S3 objet.
Les importations suivantes s'appliquent à tous les exemples de cette section de pagination synchrone.
import java.io.IOException; import java.nio.ByteBuffer; import java.util.Random; import software.amazon.awssdk.core.waiters.WaiterResponse; import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.services.s3.S3Client; import software.amazon.awssdk.services.s3.paginators.ListObjectsV2Iterable; import software.amazon.awssdk.core.sync.RequestBody; import software.amazon.awssdk.services.s3.model.S3Exception; import software.amazon.awssdk.services.s3.model.PutObjectRequest; import software.amazon.awssdk.services.s3.model.ListObjectsV2Request; import software.amazon.awssdk.services.s3.model.ListObjectsV2Response; import software.amazon.awssdk.services.s3.model.S3Object; import software.amazon.awssdk.services.s3.model.GetObjectRequest; import software.amazon.awssdk.services.s3.model.DeleteObjectRequest; import software.amazon.awssdk.services.s3.model.DeleteBucketRequest; import software.amazon.awssdk.services.s3.model.CreateMultipartUploadRequest; import software.amazon.awssdk.services.s3.model.CreateMultipartUploadResponse; import software.amazon.awssdk.services.s3.model.CompletedMultipartUpload; import software.amazon.awssdk.services.s3.model.CreateBucketRequest; import software.amazon.awssdk.services.s3.model.CompletedPart; import software.amazon.awssdk.services.s3.model.CreateBucketConfiguration; import software.amazon.awssdk.services.s3.model.UploadPartRequest; import software.amazon.awssdk.services.s3.model.CompleteMultipartUploadRequest; import software.amazon.awssdk.services.s3.waiters.S3Waiter; import software.amazon.awssdk.services.s3.model.HeadBucketRequest; import software.amazon.awssdk.services.s3.model.HeadBucketResponse;
ListObjectsV2Request listReq = ListObjectsV2Request.builder() .bucket(bucketName) .maxKeys(1) .build(); ListObjectsV2Iterable listRes = s3.listObjectsV2Paginator(listReq); // Process response pages listRes.stream() .flatMap(r -> r.contents().stream()) .forEach(content -> System.out .println(" Key: " + content.key() + " size = " + content.size()));
Consultez l'exemple complet
Itérer sur des objets
Les exemples suivants montrent comment itérer sur les objets retournés dans la réponse à la place des pages de la réponse. La contents
méthode de ListObjectsV2Iterable
classe renvoie un SdkIterable
Utiliser un stream
L'extrait suivant utilise la stream
méthode sur le contenu de la réponse pour itérer sur la collection d'éléments paginés.
// Helper method to work with paginated collection of items directly. listRes.contents().stream() .forEach(content -> System.out .println(" Key: " + content.key() + " size = " + content.size()));
Consultez l'exemple complet
Utilisez une boucle pour chaque
Comme l'SdkIterable
Iterable
interface est étendue, vous pouvez traiter le contenu comme n'importe quel autreIterable
. L'extrait de code suivant utilise for-each
une boucle standard pour parcourir le contenu de la réponse.
for (S3Object content : listRes.contents()) { System.out.println(" Key: " + content.key() + " size = " + content.size()); }
Consultez l'exemple complet
Pagination manuelle
Si votre cas d'utilisation le requiert, la pagination manuelle demeure disponible. Utilisez le jeton suivant de l'objet de réponse pour les demandes suivantes. L'exemple suivant utilise une while
boucle.
ListObjectsV2Request listObjectsReqManual = ListObjectsV2Request.builder() .bucket(bucketName) .maxKeys(1) .build(); boolean done = false; while (!done) { ListObjectsV2Response listObjResponse = s3.listObjectsV2(listObjectsReqManual); for (S3Object content : listObjResponse.contents()) { System.out.println(content.key()); } if (listObjResponse.nextContinuationToken() == null) { done = true; } listObjectsReqManual = listObjectsReqManual.toBuilder() .continuationToken(listObjResponse.nextContinuationToken()) .build(); }
Consultez l'exemple complet
Pagination asynchrone
Les exemples suivants illustrent les méthodes de pagination asynchrone pour répertorier les tables. DynamoDB
Itérer sur les pages des noms de tables
Les deux exemples suivants utilisent un client DynamoDB asynchrone qui appelle la listTablesPaginator
méthode avec une demande pour obtenir un. ListTablesPublisher
ListTablesPublisher
implémente deux interfaces, qui offrent de nombreuses options pour traiter les réponses. Nous allons examiner les méthodes de chaque interface.
Utilisez un Subscriber
L'exemple de code suivant montre comment traiter les résultats paginés à l'aide de l'org.reactivestreams.Publisher
interface implémentée parListTablesPublisher
. Pour en savoir plus sur le modèle de flux réactifs, consultez le GitHub référentiel Reactive Streams
Les importations suivantes s'appliquent à tous les exemples de cette section de pagination asynchrone.
import io.reactivex.rxjava3.core.Flowable; import org.reactivestreams.Subscriber; import org.reactivestreams.Subscription; import reactor.core.publisher.Flux; import software.amazon.awssdk.core.async.SdkPublisher; import software.amazon.awssdk.services.dynamodb.DynamoDbAsyncClient; import software.amazon.awssdk.services.dynamodb.model.ListTablesRequest; import software.amazon.awssdk.services.dynamodb.model.ListTablesResponse; import software.amazon.awssdk.services.dynamodb.paginators.ListTablesPublisher; import java.util.List; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException;
Le code suivant permet d'acquérir une ListTablesPublisher
instance.
// Creates a default client with credentials and region loaded from the // environment. final DynamoDbAsyncClient asyncClient = DynamoDbAsyncClient.create(); ListTablesRequest listTablesRequest = ListTablesRequest.builder().limit(3).build(); ListTablesPublisher publisher = asyncClient.listTablesPaginator(listTablesRequest);
Le code suivant utilise une implémentation anonyme de org.reactivestreams.Subscriber
pour traiter les résultats de chaque page.
La méthode onSubscribe
appelle la méthode Subscription.request
pour initier les demandes de données de l'éditeur. Cette méthode doit être appelée pour commencer à obtenir les données à partir de l'éditeur.
La onNext
méthode de l'abonné traite une page de réponse en accédant à tous les noms de tables et en les imprimant. Une fois la page traitée, une autre page est demandée à l'éditeur. Cette méthode est appelée à plusieurs reprises jusqu'à ce que toutes les pages soient récupérées.
La méthode onError
est déclenchée si une erreur se produit lors de la récupération des données. Enfin, la méthode onComplete
est appelée lorsque toutes les pages ont été demandées.
// A Subscription represents a one-to-one life-cycle of a Subscriber subscribing // to a Publisher. publisher.subscribe(new Subscriber<ListTablesResponse>() { // Maintain a reference to the subscription object, which is required to request // data from the publisher. private Subscription subscription; @Override public void onSubscribe(Subscription s) { subscription = s; // Request method should be called to demand data. Here we request a single // page. subscription.request(1); } @Override public void onNext(ListTablesResponse response) { response.tableNames().forEach(System.out::println); // After you process the current page, call the request method to signal that // you are ready for next page. subscription.request(1); } @Override public void onError(Throwable t) { // Called when an error has occurred while processing the requests. } @Override public void onComplete() { // This indicates all the results are delivered and there are no more pages // left. } });
Consultez l'exemple complet
Utilisez un Consumer
L'SdkPublisher
interface qui ListTablesPublisher
implémente possède une subscribe
méthode qui prend un Consumer
et renvoie unCompletableFuture<Void>
.
La subscribe
méthode de cette interface peut être utilisée pour des cas d'utilisation simples où une surcharge org.reactivestreams.Subscriber
peut être trop importante. Comme le code ci-dessous occupe chaque page, il appelle la tableNames
méthode sur chacune d'elles. La tableNames
méthode renvoie java.util.List
l'un des noms de tables DynamoDB traités avec la méthode. forEach
// Use a Consumer for simple use cases. CompletableFuture<Void> future = publisher.subscribe( response -> response.tableNames() .forEach(System.out::println));
Consultez l'exemple complet
Itérer sur les noms des tables
Les exemples suivants montrent comment itérer sur les objets retournés dans la réponse à la place des pages de la réponse. À l'instar de l'exemple synchrone d'Amazon S3 présenté précédemment avec sa contents
méthode, la classe ListTablesPublisher
de résultats asynchrone DynamoDB possède tableNames
la méthode pratique pour interagir avec la collection d'éléments sous-jacente. Le type de retour de la tableNames
méthode est un SdkPublisher
Utilisez un Subscriber
Le code suivant acquiert SdkPublisher
l'un des ensembles sous-jacents de noms de tables.
// Create a default client with credentials and region loaded from the // environment. final DynamoDbAsyncClient asyncClient = DynamoDbAsyncClient.create(); ListTablesRequest listTablesRequest = ListTablesRequest.builder().limit(3).build(); ListTablesPublisher listTablesPublisher = asyncClient.listTablesPaginator(listTablesRequest); SdkPublisher<String> publisher = listTablesPublisher.tableNames();
Le code suivant utilise une implémentation anonyme de org.reactivestreams.Subscriber
pour traiter les résultats de chaque page.
La onNext
méthode de l'abonné traite un élément individuel de la collection. Dans ce cas, il s'agit d'un nom de table. Une fois le nom de table traité, un autre nom de table est demandé à l'éditeur. Cette méthode est appelée à plusieurs reprises jusqu'à ce que tous les noms de table soient récupérés.
// Use a Subscriber. publisher.subscribe(new Subscriber<String>() { private Subscription subscription; @Override public void onSubscribe(Subscription s) { subscription = s; subscription.request(1); } @Override public void onNext(String tableName) { System.out.println(tableName); subscription.request(1); } @Override public void onError(Throwable t) { } @Override public void onComplete() { } });
Consultez l'exemple complet
Utilisez un Consumer
L'exemple suivant utilise la subscribe
méthode SdkPublisher
qui prend un Consumer
pour traiter chaque élément.
// Use a Consumer. CompletableFuture<Void> future = publisher.subscribe(System.out::println); future.get();
Consultez l'exemple complet
Utiliser une bibliothèque tierce
Vous pouvez utiliser d'autres bibliothèques tierces au lieu d'implémenter un abonné personnalisé. Cet exemple illustre l'utilisation de RxJava, mais n'importe quelle bibliothèque implémentant les interfaces de flux réactives peut être utilisée. Consultez la page RxJava wiki GitHub
Pour utiliser la bibliothèque, ajoutez-la en tant que dépendance. Si vous utilisez Maven, l'exemple montre l'POMextrait de code à utiliser.
POMEntrée
<dependency> <groupId>io.reactivex.rxjava3</groupId> <artifactId>rxjava</artifactId> <version>3.1.6</version> </dependency>
Code
DynamoDbAsyncClient asyncClient = DynamoDbAsyncClient.create(); ListTablesPublisher publisher = asyncClient.listTablesPaginator(ListTablesRequest.builder() .build()); // The Flowable class has many helper methods that work with // an implementation of an org.reactivestreams.Publisher. List<String> tables = Flowable.fromPublisher(publisher) .flatMapIterable(ListTablesResponse::tableNames) .toList() .blockingGet(); System.out.println(tables);
Consultez l'exemple complet