5.1 sendAsync()-metoden

Du kan også sende asynkrone forespørsler ved hjelp av HttpClient. Vanligvis gjøres dette i tre tilfeller.

Det første tilfellet er at forespørselen vil ta veldig lang tid , for eksempel å sende/motta en fil. Denne operasjonen startes og utføres asynkront.

Det andre tilfellet er at du trenger å sende forespørsler veldig ofte , og du vil ikke vente på svar fra forrige forespørsel før du sender den neste.

Og til slutt, det tredje tilfellet - resultatet av forespørselen din er ikke viktig for deg . For eksempel tar du et skjermbilde av skjermen en gang i minuttet og sender det til serveren. Det vil si at logikken i søknaden din forutsetter at det er mange forespørsler og ikke alle når dem. Da er det praktisk å jobbe etter prinsippet – send og glem.

For å sende en asynkron forespørsel, må du kalle en metode sendAsync()på et objekt av HttpClient-klassen. Denne metoden avsluttes umiddelbart og returnerer en CompletableFuture<HttpResponse>. Med den kan du spore når forespørselen faktisk utføres, samt utføre en viss kode etter at forespørselen er fullført. Eksempel:

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

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

Metoden sendAsync()returnerer et objekt CompletableFuturesom inneholder en HttpResponse inni, som inneholder strengen som serveren vil returnere.

5.2 executor()-metoden, ExecutorService

Dessuten lar HttpClient deg sende til den ExecutorService(en pool av tråder) som vil bli brukt til å utføre asynkrone forespørsler. Faktisk, i Java-applikasjoner på serversiden, gjøres dette alltid.

Tross alt, hvis du for hver innkommende forespørsel til API-en din vil starte flere asynkrone forespørsler et annet sted, vil du ikke ha nok tråder. Eksempel:

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

Hvis trådpoolen ikke er angitt, er standarden .java.util.concurrent.Executors.newCachedThreadPool()