5.1 kaedah sendAsync().

Anda juga boleh menghantar permintaan tak segerak menggunakan HttpClient. Biasanya ini dilakukan dalam tiga kes.

Kes pertama ialah permintaan akan mengambil masa yang sangat lama , contohnya, menghantar/menerima fail. Operasi ini kemudiannya dimulakan dan dilaksanakan secara tak segerak.

Kes kedua ialah anda perlu menghantar permintaan dengan kerap dan anda tidak mahu menunggu jawapan daripada permintaan sebelumnya sebelum menghantar permintaan seterusnya.

Dan akhirnya, kes ketiga - hasil permintaan anda tidak penting kepada anda . Sebagai contoh, anda mengambil tangkapan skrin skrin anda sekali seminit dan menghantarnya ke pelayan. Iaitu, logik permohonan anda menganggap bahawa terdapat banyak permintaan dan tidak semua mencapainya. Kemudian ia adalah mudah untuk bekerja mengikut prinsip - hantar dan lupa.

Untuk menghantar permintaan tak segerak, anda perlu memanggil kaedah sendAsync()pada objek kelas HttpClient. Kaedah ini keluar serta-merta dan mengembalikan a CompletableFuture<HttpResponse>. Dengan itu, anda boleh menjejaki apabila permintaan itu benar-benar dilaksanakan, serta melaksanakan kod tertentu selepas permintaan itu selesai. Contoh:

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

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

Kaedah sendAsync()mengembalikan objek CompletableFutureyang mengandungi HttpResponse di dalamnya, yang mengandungi rentetan yang pelayan akan kembalikan.

5.2 Kaedah pelaksana(), ExecutorService

Selain itu, HttpClient membenarkan anda menghantar kepadanya ExecutorService(kumpulan benang) yang akan digunakan untuk melaksanakan permintaan tak segerak. Sebenarnya, dalam aplikasi Java sebelah pelayan, ini sentiasa dilakukan.

Lagipun, jika untuk setiap permintaan masuk ke API anda, anda akan melancarkan beberapa permintaan tak segerak di tempat lain, anda tidak akan mempunyai benang yang mencukupi. 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 benang tidak ditetapkan, maka lalai ialah .java.util.concurrent.Executors.newCachedThreadPool()