AWS SDK for Java 1.x telah memasuki mode pemeliharaan pada 31 Juli 2024, dan akan mencapai end-of-support
Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Pemrograman Asinkron
Anda dapat menggunakan metode sinkron atau asinkron untuk memanggil operasi pada layanan. AWS Metode sinkron memblokir eksekusi thread Anda hingga klien menerima respons dari layanan. Metode asinkron segera kembali, memberikan kontrol kembali ke utas panggilan tanpa menunggu respons.
Karena metode asinkron kembali sebelum respons tersedia, Anda memerlukan cara untuk mendapatkan respons saat sudah siap. AWS SDK for Java Ini menyediakan dua cara: objek masa depan dan metode callback.
Java Berjangka
Metode asinkron dalam AWS SDK for Java mengembalikan objek Future
Panggil Future
isDone()
metode untuk melihat apakah layanan telah menyediakan objek respons. Ketika respon sudah siap, Anda bisa mendapatkan objek respon dengan memanggil Future
get()
metode. Anda dapat menggunakan mekanisme ini untuk melakukan polling secara berkala untuk hasil operasi asinkron sementara aplikasi Anda terus bekerja pada hal-hal lain.
Berikut adalah contoh operasi asinkron yang memanggil Lambda fungsi, menerima Future
yang dapat menampung objek. InvokeResult InvokeResult
Objek diambil hanya setelah isDone()
itutrue
.
import com.amazonaws.services.lambda.AWSLambdaAsyncClient; import com.amazonaws.services.lambda.model.InvokeRequest; import com.amazonaws.services.lambda.model.InvokeResult; import java.nio.ByteBuffer; import java.util.concurrent.Future; import java.util.concurrent.ExecutionException; public class InvokeLambdaFunctionAsync { public static void main(String[] args) { String function_name = "HelloFunction"; String function_input = "{\"who\":\"SDK for Java\"}"; AWSLambdaAsync lambda = AWSLambdaAsyncClientBuilder.defaultClient(); InvokeRequest req = new InvokeRequest() .withFunctionName(function_name) .withPayload(ByteBuffer.wrap(function_input.getBytes())); Future<InvokeResult> future_res = lambda.invokeAsync(req); System.out.print("Waiting for future"); while (future_res.isDone() == false) { System.out.print("."); try { Thread.sleep(1000); } catch (InterruptedException e) { System.err.println("\nThread.sleep() was interrupted!"); System.exit(1); } } try { InvokeResult res = future_res.get(); if (res.getStatusCode() == 200) { System.out.println("\nLambda function returned:"); ByteBuffer response_payload = res.getPayload(); System.out.println(new String(response_payload.array())); } else { System.out.format("Received a non-OK response from {AWS}: %d\n", res.getStatusCode()); } } catch (InterruptedException | ExecutionException e) { System.err.println(e.getMessage()); System.exit(1); } System.exit(0); } }
Callback Asinkron
Selain menggunakan Future
objek Java untuk memantau status permintaan asinkron, SDK juga memungkinkan Anda untuk menerapkan kelas yang menggunakan antarmuka. AsyncHandler AsyncHandler
menyediakan dua metode yang dipanggil tergantung pada bagaimana permintaan selesai: onSuccess
danonError
.
Keuntungan utama dari pendekatan antarmuka callback adalah membebaskan Anda dari keharusan melakukan polling Future
objek untuk mengetahui kapan permintaan telah selesai. Sebagai gantinya, kode Anda dapat segera memulai aktivitas berikutnya, dan mengandalkan SDK untuk memanggil handler Anda pada waktu yang tepat.
import com.amazonaws.services.lambda.AWSLambdaAsync; import com.amazonaws.services.lambda.AWSLambdaAsyncClientBuilder; import com.amazonaws.services.lambda.model.InvokeRequest; import com.amazonaws.services.lambda.model.InvokeResult; import com.amazonaws.handlers.AsyncHandler; import java.nio.ByteBuffer; import java.util.concurrent.Future; public class InvokeLambdaFunctionCallback { private class AsyncLambdaHandler implements AsyncHandler<InvokeRequest, InvokeResult> { public void onSuccess(InvokeRequest req, InvokeResult res) { System.out.println("\nLambda function returned:"); ByteBuffer response_payload = res.getPayload(); System.out.println(new String(response_payload.array())); System.exit(0); } public void onError(Exception e) { System.out.println(e.getMessage()); System.exit(1); } } public static void main(String[] args) { String function_name = "HelloFunction"; String function_input = "{\"who\":\"SDK for Java\"}"; AWSLambdaAsync lambda = AWSLambdaAsyncClientBuilder.defaultClient(); InvokeRequest req = new InvokeRequest() .withFunctionName(function_name) .withPayload(ByteBuffer.wrap(function_input.getBytes())); Future<InvokeResult> future_res = lambda.invokeAsync(req, new AsyncLambdaHandler()); System.out.print("Waiting for async callback"); while (!future_res.isDone() && !future_res.isCancelled()) { // perform some other tasks... try { Thread.sleep(1000); } catch (InterruptedException e) { System.err.println("Thread.sleep() was interrupted!"); System.exit(0); } System.out.print("."); } } }
Praktik Terbaik
Eksekusi Callback
Implementasi Anda AsyncHandler
dijalankan di dalam kumpulan utas yang dimiliki oleh klien asinkron. Kode pendek dan cepat dieksekusi paling tepat di dalam AsyncHandler
implementasi Anda. Kode yang berjalan lama atau memblokir di dalam metode handler Anda dapat menyebabkan pertentangan untuk kumpulan utas yang digunakan oleh klien asinkron, dan dapat mencegah klien mengeksekusi permintaan. Jika Anda memiliki tugas yang berjalan lama yang perlu dimulai dari callback, minta callback menjalankan tugasnya di thread baru atau di kumpulan utas yang dikelola oleh aplikasi Anda.
Konfigurasi Kolam Benang
Klien asinkron di AWS SDK for Java menyediakan kumpulan utas default yang seharusnya berfungsi untuk sebagian besar aplikasi. Anda dapat menerapkan kustom ExecutorService
Misalnya, Anda dapat memberikan ExecutorService
implementasi yang menggunakan kustom ThreadFactory
Akses Asinkron
TransferManagerKelas di SDK menawarkan dukungan asinkron untuk bekerja dengan. Amazon S3TransferManager
mengelola unggahan dan unduhan asinkron, menyediakan pelaporan kemajuan mendetail tentang transfer, dan mendukung panggilan balik ke berbagai peristiwa.