5.1 metoda sendAsync().

De asemenea, puteți trimite cereri asincrone folosind HttpClient. De obicei, acest lucru se face în trei cazuri.

Primul caz este că cererea va dura foarte mult timp , de exemplu, trimiterea/primirea unui fișier. Această operație este apoi pornită și executată asincron.

Al doilea caz este că trebuie să trimiteți solicitări foarte des și nu doriți să așteptați un răspuns de la cererea anterioară înainte de a o trimite pe următoarea.

Și, în sfârșit, al treilea caz - rezultatul solicitării tale nu este important pentru tine . De exemplu, faceți o captură de ecran a ecranului dvs. o dată pe minut și o trimiteți la server. Adică, logica aplicației tale presupune că există multe solicitări și nu toate ajung la ele. Atunci este convenabil să lucrați conform principiului - trimiteți și uitați.

Pentru a trimite o cerere asincronă, trebuie să apelați o metodă sendAsync()pe un obiect din clasa HttpClient. Această metodă iese imediat și returnează un CompletableFuture<HttpResponse>. Cu acesta, puteți urmări când solicitarea este executată efectiv, precum și să executați un anumit cod după finalizarea cererii. Exemplu:

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

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

Metoda sendAsync()returnează un obiect CompletableFuturecare conține un HttpResponse în interior, care conține șirul pe care serverul îl va returna.

5.2 Metoda executor(), ExecutorService

De asemenea, HttpClient vă permite să treceți la acesta ExecutorService(un grup de fire de execuție) care va fi folosit pentru a efectua cereri asincrone. De fapt, în aplicațiile Java de pe partea de server, acest lucru se face întotdeauna.

La urma urmei, dacă pentru fiecare solicitare primită către API-ul tău, vei lansa mai multe solicitări asincrone în altă parte, nu vei avea suficiente fire. Exemplu:

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

Dacă pool-ul de fire nu este setat, atunci valoarea implicită este .java.util.concurrent.Executors.newCachedThreadPool()