5.1 метод sendAsync().

Можете също да изпращате асинхронни заявки с помощта на HttpClient. Обикновено това се прави в три случая.

Първият случай е, че заявката ще отнеме много дълго време , например изпращане / получаване на файл. След това тази операция се стартира и изпълнява асинхронно.

Вторият случай е, че трябва да изпращате заявки много често и не искате да чакате отговор от предишната заявка, преди да изпратите следващата.

И накрая, третият случай - резултатът от вашата заявка не е важен за вас . Например правите екранна снимка на екрана си веднъж на minutesа и я изпращате на сървъра. Тоест логиката на вашето приложение предполага, че има много заявки и не всички достигат до тях. Тогава е удобно да работите на принципа - изпрати и забрави.

За да изпратите асинхронна заявка, трябва да извикате метод sendAsync()на обект от класа HttpClient. Този метод излиза веднага и връща CompletableFuture<HttpResponse>. С него можете да проследите кога заявката действително е изпълнена, Howто и да изпълните определен code, след като заявката е изпълнена. Пример:

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 applications това винаги се прави.

В крайна сметка, ако за всяка входяща заявка към вашия 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()