Bekerja dengan hasil paginasi menggunakan 2.x AWS SDK for Java - AWS SDK for Java 2.x

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Bekerja dengan hasil paginasi menggunakan 2.x AWS SDK for Java

Banyak AWS operasi mengembalikan hasil paginasi ketika objek respons terlalu besar untuk dikembalikan dalam satu respons. Di AWS SDK for Java 1.0, respons berisi token yang Anda gunakan untuk mengambil halaman hasil berikutnya. Sebaliknya, AWS SDK for Java 2.x memiliki metode autopagination yang membuat beberapa panggilan layanan untuk mendapatkan halaman hasil berikutnya untuk Anda secara otomatis. Anda hanya perlu menulis kode yang memproses hasilnya. Autopagination tersedia untuk klien sinkron dan asinkron.

catatan

Cuplikan kode ini mengasumsikan bahwa Anda memahami dasar-dasar penggunaan SDK, dan telah mengonfigurasi lingkungan Anda dengan akses masuk tunggal.

pagination sinkron

Contoh berikut menunjukkan metode pagination sinkron untuk mencantumkan objek Amazon S3 dalam bucket.

Iterasi di atas halaman

Contoh pertama menunjukkan penggunaan objek listRes paginator, sebuah ListObjectsV2Iterablecontoh, untuk iterasi melalui semua halaman respon dengan metode. stream Kode mengalir di atas halaman respons, mengubah aliran respons menjadi aliran S3Object konten, dan kemudian memproses konten objek. Amazon S3

Impor berikut berlaku untuk semua contoh di bagian pagination sinkron ini.

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()));

Lihat contoh lengkapnya di GitHub.

Iterasi di atas objek

Contoh berikut menunjukkan cara untuk mengulangi objek yang dikembalikan dalam respons alih-alih halaman respons. contentsMetode ListObjectsV2Iterable kelas mengembalikan sebuah SdkIterableyang menyediakan beberapa metode untuk memproses elemen konten yang mendasarinya.

Gunakan aliran

Cuplikan berikut menggunakan stream metode pada konten respons untuk mengulangi koleksi item paginasi.

// Helper method to work with paginated collection of items directly. listRes.contents().stream() .forEach(content -> System.out .println(" Key: " + content.key() + " size = " + content.size()));

Lihat contoh lengkapnya di GitHub.

Gunakan untuk setiap loop

Karena SdkIterable memperluas Iterable antarmuka, Anda dapat memproses konten seperti apa punIterable. Cuplikan berikut menggunakan for-each loop standar untuk iterasi melalui isi respon.

for (S3Object content : listRes.contents()) { System.out.println(" Key: " + content.key() + " size = " + content.size()); }

Lihat contoh lengkapnya di GitHub.

Pagination manual

Jika kasus penggunaan Anda memerlukannya, pagination manual masih tersedia. Gunakan token berikutnya di objek respons untuk permintaan berikutnya. Contoh berikut menggunakan while loop.

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(); }

Lihat contoh lengkapnya di GitHub.

pagination asinkron

Contoh berikut menunjukkan metode pagination asinkron untuk daftar tabel. DynamoDB

Iterasi di atas halaman nama tabel

Dua contoh berikut menggunakan klien DynamoDB asinkron yang memanggil metode dengan permintaan listTablesPaginator untuk mendapatkan file. ListTablesPublisher ListTablesPublishermengimplementasikan dua antarmuka, yang menyediakan banyak opsi untuk memproses respons. Kita akan melihat metode masing-masing antarmuka.

Gunakan Subscriber

Contoh kode berikut menunjukkan bagaimana memproses hasil paginasi dengan menggunakan org.reactivestreams.Publisher antarmuka yang diimplementasikan oleh. ListTablesPublisher Untuk mempelajari lebih lanjut tentang model aliran reaktif, lihat repo Reactive Streams. GitHub

Impor berikut berlaku untuk semua contoh di bagian pagination asinkron ini.

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;

Kode berikut memperoleh sebuah 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);

Kode berikut menggunakan implementasi anonim org.reactivestreams.Subscriber untuk memproses hasil untuk setiap halaman.

onSubscribeMetode ini memanggil Subscription.request metode untuk memulai permintaan data dari penerbit. Metode ini harus dipanggil untuk mulai mendapatkan data dari penerbit.

onNextMetode pelanggan memproses halaman respons dengan mengakses semua nama tabel dan mencetak masing-masing. Setelah halaman diproses, halaman lain diminta dari penerbit. Metode ini dipanggil berulang kali sampai semua halaman diambil.

onErrorMetode ini dipicu jika terjadi kesalahan saat mengambil data. Akhirnya, onComplete metode ini dipanggil ketika semua halaman telah diminta.

// 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. } });

Lihat contoh lengkapnya di GitHub.

Gunakan Consumer

SdkPublisherAntarmuka yang ListTablesPublisher mengimplementasikan memiliki subscribe metode yang mengambil Consumer dan mengembalikan aCompletableFuture<Void>.

subscribeMetode dari antarmuka ini dapat digunakan untuk kasus penggunaan sederhana ketika overhead org.reactivestreams.Subscriber mungkin terlalu banyak. Karena kode di bawah ini menghabiskan setiap halaman, ia memanggil tableNames metode pada masing-masing halaman. tableNamesMetode mengembalikan nama tabel DynamoDB yang diproses dengan metode. java.util.List forEach

// Use a Consumer for simple use cases. CompletableFuture<Void> future = publisher.subscribe( response -> response.tableNames() .forEach(System.out::println));

Lihat contoh lengkapnya di GitHub.

Ulangi nama tabel

Contoh berikut menunjukkan cara untuk mengulangi objek yang dikembalikan dalam respons alih-alih halaman respons. Mirip dengan contoh Amazon S3 sinkron yang sebelumnya ditampilkan dengan contents metodenya, kelas hasil asinkron DynamoDBListTablesPublisher, memiliki tableNames metode kenyamanan untuk berinteraksi dengan koleksi item yang mendasarinya. Jenis pengembalian tableNames metode adalah SdkPublisheryang dapat digunakan untuk meminta item di semua halaman.

Gunakan Subscriber

Kode berikut memperoleh koleksi SdkPublisher yang mendasari nama tabel.

// 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();

Kode berikut menggunakan implementasi anonim org.reactivestreams.Subscriber untuk memproses hasil untuk setiap halaman.

onNextMetode pelanggan memproses elemen individual dari koleksi. Dalam hal ini, itu adalah nama tabel. Setelah nama tabel diproses, nama tabel lain diminta dari penerbit. Metode ini dipanggil berulang kali sampai semua nama tabel diambil.

// 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() { } });

Lihat contoh lengkapnya di GitHub.

Gunakan Consumer

Contoh berikut menggunakan subscribe metode SdkPublisher yang membutuhkan a Consumer untuk memproses setiap item.

// Use a Consumer. CompletableFuture<Void> future = publisher.subscribe(System.out::println); future.get();

Lihat contoh lengkapnya di GitHub.

Gunakan pustaka pihak ketiga

Anda dapat menggunakan pustaka pihak ketiga lainnya alih-alih mengimplementasikan pelanggan khusus. Contoh ini menunjukkan penggunaan RxJava, tetapi pustaka apa pun yang mengimplementasikan antarmuka aliran reaktif dapat digunakan. Lihat halaman RxJava wiki GitHub untuk informasi lebih lanjut tentang perpustakaan itu.

Untuk menggunakan perpustakaan, tambahkan sebagai dependensi. Jika menggunakan Maven, contoh menunjukkan POM cuplikan yang akan digunakan.

POMEntri

<dependency> <groupId>io.reactivex.rxjava3</groupId> <artifactId>rxjava</artifactId> <version>3.1.6</version> </dependency>

Kode

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);

Lihat contoh lengkapnya di GitHub.