Java Academy · Pelajaran

Pengendalian Ralat dan Aliran Kerja HTTP Async

Kendalikan ralat dengan exceptionally, handle dan whenComplete, kemudian bina saluran paip klien HTTP async.

Pelajaran 4 daripada 413 langkah

Pengendalian Ralat dan Aliran Kerja HTTP Async ialah pelajaran Java Academy percuma di CoddyKit. Ini ialah pelajaran 4 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Java Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Java Academy merangkumi sejumlah 4 pelajaran.

Mengapa Pengendalian Ralat Tak Segerak Penting

Dalam alur tak segerak, pengecualian tidak disebarkan dengan cara yang sama seperti dalam kod segerak. Anda mesti mengendalikan ralat secara jelas menggunakan exceptionally, handle atau whenComplete.

exceptionally: Memulihkan daripada Ralat

exceptionally(Function<Throwable, T>) hanya dipanggil jika future selesai dengan pengecualian. Ia menyediakan nilai sandaran supaya aliran terus berjalan.

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: Mengubah Kejayaan dan Kegagalan

handle(BiFunction<T, Throwable, U>) dipanggil untuk kejayaan dan kegagalan. Salah satu daripada dua argumen tersebut akan menjadi null.

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

whenComplete: Kesan Sampingan Selepas Apa-apa Hasil

whenComplete(BiConsumer) dipanggil selepas selesai tanpa mengira hasilnya. Ia tidak mengubah hasil — gunakan untuk pengelogan, metrik atau pembersihan.

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

Mencuba Semula Future yang Gagal

Laksanakan logik percubaan semula dengan memanggil operasi secara rekursif apabila berlaku kegagalan, sehingga mencapai bilangan percubaan maksimum.

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: GET Tak Segerak

HttpClient Java 11 menyediakan HTTP tak segerak sepenuhnya melalui sendAsync(), yang mengembalikan 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);

Merangkaikan Beberapa Panggilan HTTP

Gunakan thenCompose untuk merangkaikan panggilan HTTP yang saling bergantung: mula-mula dapatkan pengguna, kemudian gunakan ID pengguna itu untuk mendapatkan pesanannya.

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

Panggilan HTTP Selari dengan allOf

Hantar permintaan kepada beberapa titik akhir secara selari, kemudian kumpulkan semua respons apabila semuanya selesai.

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

Had Masa pada Panggilan HTTP

Gunakan orTimeout terus pada panggilan HTTP tak segerak untuk membatalkannya jika pelayan mengambil masa terlalu lama.

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

Pengesahan Kod Status dalam Aliran

Gunakan thenApply untuk menyemak kod status HTTP dan lontarkan pengecualian domain jika kod itu menunjukkan ralat, supaya pengendalian ralat dalam aliran kekal konsisten.

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

Menggabungkan Pemulihan Ralat dan Pengelogan

Gunakan whenComplete untuk pengelogan dan exceptionally untuk pemulihan dalam aliran yang sama — kedua-duanya dapat digabungkan dengan kemas.

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

Semakan Pantas

Kaedah CompletableFuture manakah yang dipanggil ONLY apabila future gagal?

Ringkasan

Gunakan exceptionally untuk nilai sandaran, handle untuk mengubah kedua-dua hasil, dan whenComplete untuk kesan sampingan. Bina aliran HTTP tak segerak dengan Java 11 HttpClient + thenCompose + allOf.

Percuma untuk bermula

Pelajari Java dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
104
Pelajaran
374

Soalan Lazim

Adakah pelajaran “Pengendalian Ralat dan Aliran Kerja HTTP Async” percuma?

Ya — teks penuh “Pengendalian Ralat dan Aliran Kerja HTTP Async” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus Java Academy, tingkat taraf kepada CoddyKit PRO. Kursus Java Academy merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “Pengendalian Ralat dan Aliran Kerja HTTP Async”?

Kendalikan ralat dengan exceptionally, handle dan whenComplete, kemudian bina saluran paip klien HTTP async. Anda berlatih Java Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan Java Academy?

Tiada pengalaman terdahulu diperlukan. Pembelajaran Java Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 4 daripada 4.

Berapa lamakah pelajaran “Pengendalian Ralat dan Aliran Kerja HTTP Async” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran Java Academy ini?

Ya. Setiap pelajaran Java Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Mencipta dan Melengkapkan CompletableFutures
  2. Merantaikan dengan thenApply dan thenCompose
  3. Menggabungkan Future: allOf dan anyOf
  4. Pengendalian Ralat dan Aliran Kerja HTTP Async
← Kembali ke Java Academy