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 ListObjectsV2Iterable
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
Iterasi di atas objek
Contoh berikut menunjukkan cara untuk mengulangi objek yang dikembalikan dalam respons alih-alih halaman respons. contents
Metode ListObjectsV2Iterable
kelas mengembalikan sebuah SdkIterable
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
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
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
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
ListTablesPublisher
mengimplementasikan 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
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.
onSubscribe
Metode ini memanggil Subscription.request
metode untuk memulai permintaan data dari penerbit. Metode ini harus dipanggil untuk mulai mendapatkan data dari penerbit.
onNext
Metode 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.
onError
Metode 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
Gunakan Consumer
SdkPublisher
Antarmuka yang ListTablesPublisher
mengimplementasikan memiliki subscribe
metode yang mengambil Consumer
dan mengembalikan aCompletableFuture<Void>
.
subscribe
Metode 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. tableNames
Metode 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
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 SdkPublisher
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.
onNext
Metode 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
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
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 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