5.1 phương thức sendAsync()

Bạn cũng có thể gửi yêu cầu không đồng bộ bằng cách sử dụng HttpClient. Thông thường điều này được thực hiện trong ba trường hợp.

Trường hợp đầu tiên là yêu cầu sẽ mất rất nhiều thời gian , chẳng hạn như gửi/nhận tệp. Hoạt động này sau đó được bắt đầu và thực hiện không đồng bộ.

Trường hợp thứ hai là bạn cần gửi yêu cầu rất thường xuyên và bạn không muốn đợi phản hồi từ yêu cầu trước rồi mới gửi yêu cầu tiếp theo.

Và cuối cùng, trường hợp thứ ba - kết quả yêu cầu của bạn không quan trọng đối với bạn . Ví dụ: bạn chụp ảnh màn hình của mình mỗi phút một lần và gửi nó đến máy chủ. Nghĩa là, logic của ứng dụng của bạn giả định rằng có nhiều yêu cầu và không phải tất cả đều đạt được chúng. Sau đó, thật thuận tiện để làm việc theo nguyên tắc - gửi và quên.

Để gửi một yêu cầu không đồng bộ, bạn cần gọi một phương thức sendAsync()trên một đối tượng của lớp HttpClient. Phương thức này thoát ngay lập tức và trả về một tệp CompletableFuture<HttpResponse>. Với nó, bạn có thể theo dõi thời điểm yêu cầu thực sự được thực thi, cũng như thực thi mã nhất định sau khi yêu cầu được hoàn thành. Ví dụ:

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

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

Phương thức sendAsync()trả về một đối tượng CompletableFuturecó chứa một HttpResponse bên trong, chứa chuỗi mà máy chủ sẽ trả về.

5.2 Phương thức executor(), ExecutorService

Ngoài ra, HttpClient cho phép bạn chuyển đến nó ExecutorService(một nhóm các luồng) sẽ được sử dụng để thực hiện các yêu cầu không đồng bộ. Trên thực tế, trong các ứng dụng Java phía máy chủ, điều này luôn được thực hiện.

Rốt cuộc, nếu đối với mỗi yêu cầu đến API của bạn, bạn sẽ khởi chạy một số yêu cầu không đồng bộ ở một nơi khác, thì bạn sẽ không có đủ chuỗi. Ví dụ:

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

Nếu nhóm luồng không được đặt, thì mặc định là .java.util.concurrent.Executors.newCachedThreadPool()