5.1 sendAsync() metode

Du kan også sende asynkrone anmodninger ved hjælp af HttpClient. Normalt gøres dette i tre tilfælde.

Det første tilfælde er, at anmodningen vil tage meget lang tid , for eksempel at sende/modtage en fil. Denne operation startes og udføres derefter asynkront.

Det andet tilfælde er, at du skal sende forespørgsler meget ofte , og du ønsker ikke at vente på et svar fra den forrige anmodning, før du sender den næste.

Og endelig, det tredje tilfælde - resultatet af din anmodning er ikke vigtigt for dig . For eksempel tager du et skærmbillede af din skærm en gang i minuttet og sender det til serveren. Det vil sige, logikken i din ansøgning forudsætter, at der er mange anmodninger, og at ikke alle når dem. Så er det praktisk at arbejde efter princippet - send og glem.

For at sende en asynkron anmodning skal du kalde en metode sendAsync()på et objekt af klassen HttpClient. Denne metode afsluttes med det samme og returnerer en CompletableFuture<HttpResponse>. Med den kan du spore, hvornår anmodningen rent faktisk udføres, samt udføre en bestemt kode, efter anmodningen er fuldført. Eksempel:

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

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

Metoden sendAsync()returnerer et objekt CompletableFuture, der indeholder et HttpResponse inde, som indeholder den streng, som serveren returnerer.

5.2 executor()-metoden, ExecutorService

HttpClient giver dig også mulighed for at overføre til det ExecutorService(en pulje af tråde), som vil blive brugt til at udføre asynkrone anmodninger. Faktisk er dette altid gjort i Java-applikationer på serversiden.

Når alt kommer til alt, hvis du for hver indkommende anmodning til din API vil starte flere asynkrone anmodninger et andet sted, vil du ikke have nok tråde. 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ådpuljen ikke er indstillet, er standardindstillingen .java.util.concurrent.Executors.newCachedThreadPool()