5.1 sendAsync() methode

U kunt ook asynchrone verzoeken verzenden met behulp van HttpClient. Meestal gebeurt dit in drie gevallen.

Het eerste geval is dat het verzoek erg lang duurt , bijvoorbeeld het verzenden / ontvangen van een bestand. Deze bewerking wordt vervolgens asynchroon gestart en uitgevoerd.

Het tweede geval is dat u heel vaak verzoeken moet verzenden en u niet wilt wachten op een antwoord van het vorige verzoek voordat u het volgende verzoek verzendt.

En tot slot, het derde geval - het resultaat van uw verzoek is niet belangrijk voor u . Je maakt bijvoorbeeld een keer per minuut een screenshot van je scherm en stuurt deze naar de server. Dat wil zeggen, de logica van uw toepassing gaat ervan uit dat er veel verzoeken zijn en dat ze niet allemaal worden bereikt. Dan is het handig om volgens het principe te werken: verzenden en vergeten.

Om een ​​asynchroon verzoek te verzenden, moet u een methode aanroepen sendAsync()op een object van de klasse HttpClient. Deze methode wordt onmiddellijk afgesloten en retourneert een CompletableFuture<HttpResponse>. Hiermee kunt u bijhouden wanneer het verzoek daadwerkelijk wordt uitgevoerd, en bepaalde code uitvoeren nadat het verzoek is voltooid. Voorbeeld:

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

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

De methode sendAsync()retourneert een object CompletableFuturedat een HttpResponse bevat, die de string bevat die de server zal retourneren.

5.2 De executor() methode, ExecutorService

Ook kunt u met HttpClient doorgeven ExecutorService(een pool van threads) die zullen worden gebruikt om asynchrone verzoeken uit te voeren. In Java-toepassingen aan de serverzijde wordt dit eigenlijk altijd gedaan.

Immers, als je voor elk binnenkomend verzoek aan je API meerdere asynchrone verzoeken ergens anders start, heb je niet genoeg threads. Voorbeeld:

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

Als de threadpool niet is ingesteld, is de standaardwaarde .java.util.concurrent.Executors.newCachedThreadPool()