5.1 เมธอด sendAsync()

คุณยังสามารถส่งคำขอแบบอะซิงโครนัสโดยใช้ HttpClient โดยปกติจะทำในสามกรณี

กรณีแรกคือการร้องขอจะใช้เวลานานมากเช่น การส่ง/รับไฟล์ การดำเนินการนี้จะเริ่มต้นและดำเนินการแบบอะซิงโครนัส

กรณีที่สองคือคุณต้องส่งคำขอบ่อยมากและไม่ต้องการรอการตอบกลับจากคำขอก่อนหน้าก่อนที่จะส่งคำขอถัดไป

และสุดท้าย กรณีที่สาม - ผลลัพธ์ของคำขอของคุณไม่สำคัญสำหรับ คุณ ตัวอย่างเช่น คุณถ่ายภาพหน้าจอของคุณนาทีละครั้งและส่งไปยังเซิร์ฟเวอร์ นั่นคือ ตรรกะของแอปพลิเคชันของคุณจะถือว่ามีคำขอจำนวนมากและเข้าถึงไม่ได้ทั้งหมด จากนั้นจะสะดวกในการทำงานตามหลักการ - ส่งและลืม

ในการส่งคำขอแบบอะซิงโครนัส คุณต้องเรียกใช้เมธอดsendAsync()บนวัตถุของคลาส HttpClient เมธอดนี้ออกทันทีและส่งคืนไฟล์CompletableFuture<HttpResponse>. ด้วยเครื่องมือนี้ คุณจะสามารถติดตามได้ว่าเมื่อใดที่คำขอได้รับการดำเนินการจริง รวมถึงเรียกใช้รหัสบางอย่างหลังจากที่คำขอเสร็จสิ้น ตัวอย่าง:


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

วิธีการsendAsync()ส่งคืนวัตถุCompletableFutureที่มี HttpResponse ภายในซึ่งมีสตริงที่เซิร์ฟเวอร์จะส่งคืน

5.2 เมธอด executor() ExecutorService

นอกจากนี้ HttpClient ยังให้คุณส่งผ่านไปยังมันExecutorService(กลุ่มของเธรด) ที่จะใช้ในการดำเนินการตามคำขอแบบอะซิงโครนัส อันที่จริง ในแอปพลิเคชัน Java ฝั่งเซิร์ฟเวอร์ การดำเนินการนี้จะทำเสมอ

ท้ายที่สุด หากสำหรับแต่ละคำขอที่ส่งไปยัง API ของคุณ คุณจะเปิดใช้คำขอแบบอะซิงโครนัสหลายรายการในที่อื่น แสดงว่าคุณจะมีเธรดไม่เพียงพอ ตัวอย่าง:


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

หากไม่ได้ตั้งค่าเธรดพูล ค่าดีฟอลต์คือjava.util.concurrent.Executors.newCachedThreadPool()