Pengendalian Ralat dan Aliran Kerja HTTP Async
Kendalikan ralat dengan exceptionally, handle dan whenComplete, kemudian bina saluran paip klien HTTP async.
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 failedhandle: 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.
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
- Mencipta dan Melengkapkan CompletableFutures
- Merantaikan dengan thenApply dan thenCompose
- Menggabungkan Future: allOf dan anyOf
- Pengendalian Ralat dan Aliran Kerja HTTP Async