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 CompletableFuture
som 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()