5.1 metoda sendAsync().

Możesz również wysyłać żądania asynchroniczne przy użyciu HttpClient. Zwykle odbywa się to w trzech przypadkach.

Pierwszy przypadek to taki, że żądanie zajmie bardzo dużo czasu , na przykład wysłanie/odebranie pliku. Ta operacja jest następnie uruchamiana i wykonywana asynchronicznie.

Drugi przypadek to konieczność wysyłania zapytań bardzo często i nie chcesz czekać na odpowiedź z poprzedniego zapytania przed wysłaniem kolejnego.

I wreszcie trzeci przypadek - wynik Twojej prośby nie jest dla Ciebie ważny . Na przykład raz na minutę robisz zrzut ekranu i wysyłasz go na serwer. Oznacza to, że logika Twojej aplikacji zakłada, że ​​jest wiele żądań i nie wszystkie do nich docierają. Wtedy wygodnie jest pracować zgodnie z zasadą - wyślij i zapomnij.

Aby wysłać żądanie asynchroniczne, należy wywołać metodę sendAsync()na obiekcie klasy HttpClient. Ta metoda kończy się natychmiast i zwraca plik CompletableFuture<HttpResponse>. Dzięki niemu możesz śledzić, kiedy żądanie jest faktycznie wykonywane, a także wykonać określony kod po zakończeniu żądania. Przykład:

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

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

Metoda sendAsync()zwraca obiekt CompletableFuture, który zawiera wewnątrz HttpResponse, który zawiera ciąg, który serwer zwróci.

5.2 Metoda executor(), ExecutorService

Ponadto HttpClient umożliwia przekazanie do niego ExecutorService(puli wątków), które będą używane do wykonywania żądań asynchronicznych. Właściwie w aplikacjach Java po stronie serwera jest to zawsze wykonywane.

W końcu, jeśli dla każdego przychodzącego żądania do Twojego API uruchomisz kilka asynchronicznych żądań gdzie indziej, wątków nie wystarczy. Przykład:

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

Jeśli pula wątków nie jest ustawiona, wartością domyślną jest .java.util.concurrent.Executors.newCachedThreadPool()