Java Academy · Les

Foutafhandeling en asynchrone HTTP-pipeline

Handel fouten af met exceptionally, handle en whenComplete en bouw vervolgens een asynchrone HTTP-clientpipeline.

Les 4 van 413 stappen

Foutafhandeling en asynchrone HTTP-pipeline is een gratis Java Academy-les op CoddyKit. Dit is les 4 van 4. Je kunt de volledige les hieronder gratis lezen en daarna in de browser praktisch oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject Java Academy. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus Java Academy bevat in totaal 4 lessen.

Waarom asynchrone foutafhandeling belangrijk is

In asynchrone pijplijnen worden uitzonderingen niet op dezelfde manier doorgegeven als in synchrone code. Je moet fouten expliciet afhandelen met exceptionally, handle of whenComplete.

exceptionally: Fouten herstellen

exceptionally(Function<Throwable, T>) wordt alleen aangeroepen als de future met een uitzondering wordt voltooid. De methode levert een terugvalwaarde, zodat de pijplijn blijft werken.

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: Succes en fouten transformeren

handle(BiFunction<T, Throwable, U>) wordt aangeroepen bij zowel succes als fouten. Een van de twee argumenten is null.

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

whenComplete: Neveneffect na elke uitkomst

whenComplete(BiConsumer) wordt na voltooiing aangeroepen, ongeacht de uitkomst. De methode verandert het resultaat niet — gebruik haar voor logboekregistratie, metriekgegevens of opruimen.

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

Mislukte futures opnieuw proberen

Implementeer logica voor opnieuw proberen door de bewerking bij een fout recursief aan te roepen, tot een maximumaantal pogingen is bereikt.

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: Asynchrone GET-aanvraag

De HttpClient van Java 11 biedt volledig asynchroon HTTP-verkeer via sendAsync() en retourneert een CompletableFuture<HttpResponse<String>>.

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

Meerdere HTTP-aanroepen koppelen

Gebruik thenCompose om afhankelijke HTTP-aanroepen te koppelen: haal eerst de gebruiker op en gebruik vervolgens de ID van die gebruiker om diens bestellingen op te halen.

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

Parallelle HTTP-aanroepen met allOf

Stuur aanvragen parallel naar verschillende eindpunten en verzamel daarna alle antwoorden zodra ze allemaal zijn voltooid.

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

Time-out bij HTTP-aanroepen

Pas orTimeout rechtstreeks toe op de asynchrone HTTP-aanroep, zodat deze wordt geannuleerd als de server te lang nodig heeft.

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

Statuscodevalidering in de pijplijn

Gebruik thenApply om de HTTP-statuscode te controleren en een domeinuitzondering te werpen als die op een fout wijst. Zo blijft de foutafhandeling van de pijplijn consistent.

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

Fouten herstellen en logboekregistratie combineren

Gebruik whenComplete voor logboekregistratie en exceptionally voor herstel in dezelfde pijplijn — ze kunnen netjes worden gecombineerd.

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

Korte controle

Welke methode van CompletableFuture wordt ALLEEN aangeroepen wanneer de future mislukt?

Samenvatting

Gebruik exceptionally voor terugvalwaarden, handle om beide uitkomsten te transformeren en whenComplete voor neveneffecten. Bouw asynchrone HTTP-pijplijnen met Java 11 HttpClient + thenCompose + allOf.

Gratis beginnen

Leer Java met een AI-tutor — gratis

Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.

Cursussen
104
Lessen
374

Veelgestelde vragen

Is de les “Foutafhandeling en asynchrone HTTP-pipeline” gratis?

Ja — de volledige tekst van “Foutafhandeling en asynchrone HTTP-pipeline” kun je hier gratis op het web lezen. Als je interactief wilt oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is, en de rest van de cursus Java Academy wilt ontgrendelen, kun je upgraden naar CoddyKit PRO. De cursus Java Academy bevat in totaal 4 lessen.

Wat leer ik in “Foutafhandeling en asynchrone HTTP-pipeline”?

Handel fouten af met exceptionally, handle en whenComplete en bouw vervolgens een asynchrone HTTP-clientpipeline. Je oefent met Java Academy door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.

Heb ik ervaring nodig om met Java Academy te beginnen?

Ervaring vooraf is niet nodig. Java Academy op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 4 van 4.

Hoe lang duurt de les “Foutafhandeling en asynchrone HTTP-pipeline”?

De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.

Kan ik code schrijven en uitvoeren in deze les over Java Academy?

Ja. Elke les over Java Academy bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.

Alle lessen in deze cursus

  1. CompletableFutures maken en voltooien
  2. Koppelen met thenApply en thenCompose
  3. Futures combineren: allOf en anyOf
  4. Foutafhandeling en asynchrone HTTP-pipeline
← Terug naar Java Academy