5.1 metode sendAsync()

Anda juga dapat mengirim permintaan asinkron menggunakan HttpClient. Biasanya ini dilakukan dalam tiga kasus.

Kasus pertama adalah permintaan akan memakan waktu sangat lama , misalnya mengirim / menerima file. Operasi ini kemudian dimulai dan dijalankan secara asinkron.

Kasus kedua adalah Anda harus sering mengirim permintaan dan Anda tidak ingin menunggu tanggapan dari permintaan sebelumnya sebelum mengirim permintaan berikutnya.

Dan terakhir, kasus ketiga - hasil permintaan Anda tidak penting bagi Anda . Misalnya, Anda mengambil tangkapan layar layar satu menit sekali dan mengirimkannya ke server. Artinya, logika aplikasi Anda mengasumsikan bahwa ada banyak permintaan dan tidak semua mencapainya. Maka nyaman untuk bekerja sesuai dengan prinsip - kirim dan lupakan.

Untuk mengirim permintaan asinkron, Anda perlu memanggil metode sendAsync()pada objek kelas HttpClient. Metode ini segera keluar dan mengembalikan a CompletableFuture<HttpResponse>. Dengannya, Anda dapat melacak kapan permintaan benar-benar dijalankan, serta mengeksekusi kode tertentu setelah permintaan selesai. Contoh:

HttpClient client = HttpClient.newBuilder().build();

CompletableFuture<HttpResponse<String>> response = client.sendAsync(
        request,
        HttpResponse.BodyHandlers.ofString()
);

Metode sendAsync()mengembalikan objek CompletableFutureyang berisi HttpResponse di dalamnya, yang berisi string yang akan dikembalikan oleh server.

5.2 Metode executor(), ExecutorService

Juga, HttpClient memungkinkan Anda untuk meneruskannya ExecutorService(kumpulan utas) yang akan digunakan untuk melakukan permintaan asinkron. Sebenarnya di aplikasi Java sisi server, hal ini selalu dilakukan.

Lagi pula, jika untuk setiap permintaan masuk ke API Anda, Anda meluncurkan beberapa permintaan asinkron di tempat lain, Anda tidak akan memiliki cukup utas. Contoh:

ExecutorService executorService = Executors.newFixedThreadPool(2);

CompletableFuture<HttpResponse<String>> response1 = HttpClient.newBuilder()
  .executor(executorService)
  .build()
  .sendAsync(request, HttpResponse.BodyHandlers.ofString());

CompletableFuture<HttpResponse<String>> response2 = HttpClient.newBuilder()
  .executor(executorService)
  .build()
  .sendAsync(request, HttpResponse.BodyHandlers.ofString());

Jika kumpulan utas tidak disetel, maka standarnya adalah .java.util.concurrent.Executors.newCachedThreadPool()