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