5.1 sendAsync()-Methode

Sie können auch asynchrone Anfragen mit HttpClient senden. Normalerweise geschieht dies in drei Fällen.

Der erste Fall ist, dass die Anfrage sehr lange dauert , beispielsweise das Senden/Empfangen einer Datei. Dieser Vorgang wird dann asynchron gestartet und ausgeführt.

Der zweite Fall besteht darin, dass Sie sehr oft Anfragen senden müssen und nicht auf die Antwort der vorherigen Anfrage warten möchten, bevor Sie die nächste senden.

Und schließlich der dritte Fall: Das Ergebnis Ihrer Anfrage ist für Sie nicht wichtig . Sie machen beispielsweise einmal pro Minute einen Screenshot Ihres Bildschirms und senden ihn an den Server. Das heißt, die Logik Ihrer Anwendung geht davon aus, dass es viele Anfragen gibt und nicht alle diese erreichen. Dann ist es bequem, nach dem Prinzip zu arbeiten – Senden und Vergessen.

Um eine asynchrone Anfrage zu senden, müssen Sie eine Methode sendAsync()für ein Objekt der HttpClient-Klasse aufrufen. Diese Methode wird sofort beendet und gibt eine zurück CompletableFuture<HttpResponse>. Damit können Sie verfolgen, wann die Anfrage tatsächlich ausgeführt wird, und bestimmten Code ausführen, nachdem die Anfrage abgeschlossen ist. Beispiel:

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

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

Die Methode sendAsync()gibt ein Objekt zurück CompletableFuture, das eine HttpResponse enthält, die die Zeichenfolge enthält, die der Server zurückgibt.

5.2 Die executor()-Methode, ExecutorService

ExecutorServiceAußerdem können Sie mit HttpClient einen Thread-Pool übergeben, der zum Ausführen asynchroner Anforderungen verwendet wird. Tatsächlich wird dies in serverseitigen Java-Anwendungen immer durchgeführt.

Wenn Sie für jede eingehende Anfrage an Ihre API mehrere asynchrone Anfragen an anderer Stelle starten, verfügen Sie schließlich nicht über genügend Threads. Beispiel:

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

Wenn der Thread-Pool nicht festgelegt ist, ist der Standardwert .java.util.concurrent.Executors.newCachedThreadPool()