Java Academy · Lektion

Felhantering och asynkron HTTP-pipeline

Hantera fel med exceptionally, handle och whenComplete och bygg sedan en asynkron HTTP-klientpipeline.

Lektion 4 av 413 steg

Felhantering och asynkron HTTP-pipeline är en gratis lektion i Java Academy på CoddyKit. Detta är lektion 4 av 4. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för Java Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Java Academy innehåller totalt 4 lektioner.

Varför felhantering i asynkron kod är viktig

I asynkrona pipelines sprids undantag inte på samma sätt som i synkron kod. Du måste uttryckligen hantera fel med exceptionally, handle eller whenComplete.

exceptionally: Återhämtning från fel

exceptionally(Function<Throwable, T>) anropas endast om future-objektet slutförs med ett undantag. Det tillhandahåller ett reservvärde och håller pipelinen igång.

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: Omvandla lyckade och misslyckade utfall

handle(BiFunction<T, Throwable, U>) anropas vid både lyckade och misslyckade utfall. Ett av de två argumenten är null.

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

whenComplete: Sidoeffekt efter alla utfall

whenComplete(BiConsumer) anropas efter slutförandet, oavsett utfall. Det ändrar inte resultatet — använd det för loggning, mätvärden eller städning.

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

Göra nya försök med misslyckade futures

Implementera försökslogik genom att rekursivt anropa operationen vid fel, upp till ett maximalt antal försök.

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: Asynkront GET-anrop

Java 11:s HttpClient tillhandahåller helt asynkron HTTP-kommunikation via sendAsync(), som returnerar en 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);

Kedja flera HTTP-anrop

Använd thenCompose för att kedja beroende HTTP-anrop: hämta först användaren och använd sedan användarens ID för att hämta beställningarna.

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

Parallella HTTP-anrop med allOf

Skicka anrop till flera endpoints parallellt och samla sedan in alla svar när samtliga är slutförda.

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

Timeout för HTTP-anrop

Använd orTimeout direkt på det asynkrona HTTP-anropet för att avbryta det om servern tar för lång tid.

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

Validera statuskoder i pipelinen

Använd thenApply för att kontrollera HTTP-statuskoden och kasta ett domänundantag om den visar att ett fel har inträffat. På så sätt förblir felhanteringen konsekvent i pipelinen.

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

Kombinera felåterhämtning och loggning

Lägg till whenComplete för loggning och exceptionally för återhämtning i samma pipeline — de kan kombineras på ett smidigt sätt.

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

Snabbkontroll

Vilken CompletableFuture-metod anropas ENDAST när future-objektet misslyckas?

Sammanfattning

Använd exceptionally för reservvärden, handle för att omvandla båda utfallen och whenComplete för sidoeffekter. Bygg asynkrona HTTP-pipelines med Java 11 HttpClient + thenCompose + allOf.

Gratis att börja

Lär dig Java med en AI-lärare – gratis

Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.

Kurser
104
Lektioner
374

Vanliga frågor

Är lektionen ”Felhantering och asynkron HTTP-pipeline” gratis?

Ja – hela texten till ”Felhantering och asynkron HTTP-pipeline” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i Java Academy, kan Ni uppgradera till CoddyKit PRO. Kursen i Java Academy innehåller totalt 4 lektioner.

Vad lär jag mig i ”Felhantering och asynkron HTTP-pipeline”?

Hantera fel med exceptionally, handle och whenComplete och bygg sedan en asynkron HTTP-klientpipeline. Ni övar på Java Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.

Behöver jag någon erfarenhet för att börja lära mig Java Academy?

Du behöver inga förkunskaper. Utbildningen i Java Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 4 av 4.

Hur lång tid tar lektionen ”Felhantering och asynkron HTTP-pipeline”?

De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.

Kan jag skriva och köra kod i den här Java Academy-lektionen?

Ja. Varje Java Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.

Alla lektioner i den här kursen

  1. Skapa och slutför CompletableFuture-objekt
  2. Kedja med thenApply och thenCompose
  3. Kombinera futures: allOf och anyOf
  4. Felhantering och asynkron HTTP-pipeline
← Tillbaka till Java Academy