5.1 metoden sendAsync().

Du kan också skicka asynkrona förfrågningar med HttpClient. Vanligtvis görs detta i tre fall.

Det första fallet är att begäran kommer att ta mycket lång tid, till exempel att skicka/ta emot en fil. Denna operation startas sedan och exekveras asynkront.

Det andra fallet är att du behöver skicka förfrågningar väldigt ofta och du vill inte vänta på svar från föregående förfrågan innan du skickar nästa.

Och slutligen, det tredje fallet - resultatet av din förfrågan är inte viktigt för dig . Till exempel tar du en skärmdump av din skärm en gång i minuten och skickar den till servern. Det vill säga, logiken i din ansökan förutsätter att det finns många förfrågningar och att inte alla når dem. Då är det bekvämt att arbeta enligt principen – skicka och glöm.

För att skicka en asynkron begäran måste du anropa en metod sendAsync()på ett objekt av klassen HttpClient. Denna metod avslutas omedelbart och returnerar en CompletableFuture<HttpResponse>. Med den kan du spåra när begäran faktiskt exekveras, samt exekvera viss kod efter att begäran är klar. Exempel:

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

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

Metoden sendAsync()returnerar ett objekt CompletableFuturesom innehåller ett HttpResponse inuti, som innehåller strängen som servern kommer att returnera.

5.2 Metoden executor(), ExecutorService

Dessutom låter HttpClient dig skicka till den ExecutorService(en pool av trådar) som kommer att användas för att utföra asynkrona förfrågningar. Faktiskt, i Java-applikationer på serversidan görs detta alltid.

När allt kommer omkring, om du för varje inkommande begäran till ditt API kommer att starta flera asynkrona förfrågningar någon annanstans, kommer du inte att ha tillräckligt med trådar. Exempel:

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

Om trådpoolen inte är inställd är standardinställningen .java.util.concurrent.Executors.newCachedThreadPool()