0Pricing
Java Academy · Lektion

Fehlerbehandlung und asynchrone HTTP-Pipeline

Behandeln Sie Fehler mit exceptionally, handle und whenComplete und erstellen Sie anschließend eine asynchrone HTTP-Client-Pipeline.

Fehlerbehandlung und asynchrone HTTP-Pipeline ist eine kostenlose Java Academy-Lektion auf CoddyKit. Dies ist Lektion 4 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Java Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Java Academy-Kurs umfasst insgesamt 4 Lektionen.

Warum asynchrone Fehlerbehandlung wichtig ist

In asynchronen Pipelines werden Ausnahmen nicht auf dieselbe Weise weitergegeben wie in synchronem Code. Sie müssen Fehler ausdrücklich mit exceptionally, handle oder whenComplete behandeln.

exceptionally: Wiederherstellung nach Fehlern

exceptionally(Function<Throwable, T>) wird nur aufgerufen, wenn das Future mit einer Exception abgeschlossen wird. Die Methode liefert einen Fallback-Wert und hält die Pipeline am Leben.

CompletableFuture<String> safe = fetchUser(id)
    .thenApply(User::getName)
    .exceptionally(ex -> {
        log.warn("Fetch failed: " + ex.getMessage());
        return "Anonymous";
    });
System.out.println(safe.join()); // "Anonymous" if fetch failed

handle: Erfolg und Fehlschlag transformieren

handle(BiFunction<T, Throwable, U>) wird sowohl bei Erfolg als auch bei Fehlschlag aufgerufen. Eines der beiden Argumente ist jeweils null.

fetchUser(id).handle((user, ex) -> {
    if (ex != null) return UserDto.empty();
    return UserDto.from(user);
}).thenAccept(dto -> sendResponse(dto));

whenComplete: Nebeneffekt nach jedem Ergebnis

whenComplete(BiConsumer) wird unabhängig vom Ergebnis nach dem Abschluss aufgerufen. Die Methode ändert das Ergebnis nicht – verwenden Sie sie für Logging, Metriken oder Aufräumarbeiten.

fetchUser(id)
    .whenComplete((user, ex) -> {
        if (ex != null) metrics.increment("user.fetch.error");
        else            metrics.increment("user.fetch.success");
    })
    .thenAccept(u -> sendResponse(u));

Fehlgeschlagene Futures erneut versuchen

Implementieren Sie die Wiederholungslogik, indem Sie die Operation bei einem Fehlschlag rekursiv aufrufen, bis eine maximale Anzahl von Versuchen erreicht ist.

CompletableFuture<String> withRetry(Supplier<CompletableFuture<String>> task, int retries) {
    return task.get().exceptionallyCompose(ex -> {
        if (retries > 0) {
            System.out.println("Retrying... " + retries);
            return withRetry(task, retries - 1);
        }
        return CompletableFuture.failedFuture(ex);
    });
}

Java 11 HttpClient: Asynchroner GET-Aufruf

Der HttpClient von Java 11 stellt über sendAsync() vollständig asynchrones HTTP bereit und gibt ein CompletableFuture<HttpResponse<String>> zurück.

HttpClient client = HttpClient.newHttpClient();
HttpRequest req = HttpRequest.newBuilder()
    .uri(URI.create("https://api.example.com/users/1"))
    .build();
CompletableFuture<String> body = client
    .sendAsync(req, HttpResponse.BodyHandlers.ofString())
    .thenApply(HttpResponse::body);

Mehrere HTTP-Aufrufe verketten

Verwenden Sie thenCompose, um abhängige HTTP-Aufrufe zu verketten: Rufen Sie zuerst den Benutzer ab und verwenden Sie anschließend dessen ID, um seine Bestellungen abzurufen.

client.sendAsync(userReq, HttpResponse.BodyHandlers.ofString())
    .thenApply(r -> parseUser(r.body()))
    .thenCompose(user -> client.sendAsync(
        buildOrdersRequest(user.getId()),
        HttpResponse.BodyHandlers.ofString()))
    .thenApply(r -> parseOrders(r.body()))
    .thenAccept(orders -> System.out.println("Orders: " + orders.size()));

Parallele HTTP-Aufrufe mit allOf

Rufen Sie mehrere Endpunkte parallel auf und sammeln Sie anschließend alle Antworten, sobald alle Aufrufe abgeschlossen sind.

List<URI> endpoints = List.of(uri1, uri2, uri3);
List<CompletableFuture<String>> requests = endpoints.stream()
    .map(uri -> client.sendAsync(
            HttpRequest.newBuilder(uri).build(),
            HttpResponse.BodyHandlers.ofString())
        .thenApply(HttpResponse::body))
    .collect(Collectors.toList());
List<String> responses = CompletableFuture
    .allOf(requests.toArray(new CompletableFuture[0]))
    .thenApply(v -> requests.stream().map(CompletableFuture::join).collect(Collectors.toList()))
    .join();

Timeouts bei HTTP-Aufrufen

Wenden Sie orTimeout direkt auf den asynchronen HTTP-Aufruf an, um ihn abzubrechen, wenn der Server zu lange benötigt.

CompletableFuture<String> result = client
    .sendAsync(req, HttpResponse.BodyHandlers.ofString())
    .orTimeout(5, TimeUnit.SECONDS)
    .thenApply(HttpResponse::body)
    .exceptionally(ex -> "timeout or error");

Statuscode-Validierung in der Pipeline

Verwenden Sie thenApply, um den HTTP-Statuscode zu prüfen und bei einem Fehler eine domänenspezifische Exception auszulösen. So bleibt die Fehlerbehandlung in der Pipeline konsistent.

.thenApply(response -> {
    if (response.statusCode() != 200)
        throw new HttpResponseException(response.statusCode());
    return response.body();
})

Fehlerwiederherstellung und Logging kombinieren

Setzen Sie whenComplete für das Logging und exceptionally für die Wiederherstellung in derselben Pipeline ein – beide Methoden lassen sich problemlos kombinieren.

fetchData()
    .whenComplete((r, ex) -> { if (ex != null) log.error("Failed", ex); })
    .exceptionally(ex -> fallback())
    .thenAccept(result -> process(result));

Schnelltest

Welche CompletableFuture-Methode wird NUR aufgerufen, wenn das Future fehlschlägt?

Zusammenfassung

Verwenden Sie exceptionally für Fallback-Werte, handle zum Transformieren beider Ergebnisse und whenComplete für Nebeneffekte. Bauen Sie asynchrone HTTP-Pipelines mit Java 11 HttpClient, thenCompose und allOf.

Häufig gestellte Fragen

Ist die Lektion „Fehlerbehandlung und asynchrone HTTP-Pipeline“ kostenlos?

Ja — der vollständige Text von „Fehlerbehandlung und asynchrone HTTP-Pipeline“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Java Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Java Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Fehlerbehandlung und asynchrone HTTP-Pipeline“?

Behandeln Sie Fehler mit exceptionally, handle und whenComplete und erstellen Sie anschließend eine asynchrone HTTP-Client-Pipeline. Du übst Java Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um Java Academy zu starten?

Keine Vorkenntnisse erforderlich. Java Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 4 von 4.

Wie lange dauert die Lektion „Fehlerbehandlung und asynchrone HTTP-Pipeline“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser Java Academy-Lektion Code schreiben und ausführen?

Ja. Jede Java Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. CompletableFutures erstellen und abschließen
  2. Verketten mit thenApply und thenCompose
  3. Futures kombinieren: allOf und anyOf
  4. Fehlerbehandlung und asynchrone HTTP-Pipeline
← Zurück zu Java Academy