การจัดการข้อผิดพลาดและไปป์ไลน์ HTTP แบบอะซิงโครนัส
จัดการข้อผิดพลาดด้วย exceptionally, handle และ whenComplete จากนั้นสร้างไปป์ไลน์ไคลเอนต์ HTTP แบบอะซิงโครนัส
การจัดการข้อผิดพลาดและไปป์ไลน์ HTTP แบบอะซิงโครนัส เป็นบทเรียน Java Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Java Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Java Academy มีบทเรียนทั้งหมด 4 บทเรียน
เหตุใดการจัดการข้อผิดพลาดแบบอะซิงก์จึงสำคัญ
ในกระบวนการทำงานแบบอะซิงก์ ข้อยกเว้นจะไม่ส่งต่อในลักษณะเดียวกับโค้ดแบบทำงานตามลำดับ คุณต้องจัดการข้อผิดพลาดอย่างชัดเจนโดยใช้ exceptionally handle หรือ whenComplete
exceptionally: การกู้คืนจากข้อผิดพลาด
exceptionally(Function<Throwable, T>) จะถูกเรียกเฉพาะเมื่อฟิวเจอร์เสร็จสิ้นพร้อมข้อยกเว้นเท่านั้น เมธอดนี้จะมอบค่าทดแทนเพื่อให้ไปป์ไลน์ทำงานต่อได้
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: แปลงผลลัพธ์ทั้งกรณีสำเร็จและล้มเหลว
handle(BiFunction<T, Throwable, U>) จะถูกเรียกทั้งเมื่อสำเร็จและล้มเหลว โดยอาร์กิวเมนต์หนึ่งจากสองตัวจะเป็น null
fetchUser(id).handle((user, ex) -> {
if (ex != null) return UserDto.empty();
return UserDto.from(user);
}).thenAccept(dto -> sendResponse(dto));whenComplete: ผลข้างเคียงหลังจากทุกผลลัพธ์
whenComplete(BiConsumer) จะถูกเรียกหลังจากเสร็จสิ้นโดยไม่ขึ้นกับผลลัพธ์ เมธอดนี้ไม่เปลี่ยนแปลงผลลัพธ์ — ใช้สำหรับการบันทึกเหตุการณ์ เมทริก หรือการล้างทรัพยากร
fetchUser(id)
.whenComplete((user, ex) -> {
if (ex != null) metrics.increment("user.fetch.error");
else metrics.increment("user.fetch.success");
})
.thenAccept(u -> sendResponse(u));การลองใหม่สำหรับฟิวเจอร์ที่ล้มเหลว
ใช้ตรรกะการลองใหม่โดยเรียกการดำเนินการแบบวนซ้ำเมื่อเกิดความล้มเหลว จนกว่าจะลองครบจำนวนครั้งสูงสุด
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 แบบอะซิงโครนัส
Java 11 มี HttpClient ที่รองรับ HTTP แบบอะซิงโครนัสอย่างสมบูรณ์ผ่าน sendAsync() และส่งคืน 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);การเชื่อมโยงการเรียก HTTP หลายครั้ง
ใช้ thenCompose เพื่อเชื่อมโยงการเรียก HTTP ที่ขึ้นต่อกัน โดยดึงข้อมูลผู้ใช้ก่อน แล้วใช้ ID ของผู้ใช้เพื่อดึงคำสั่งซื้อ
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()));การเรียก HTTP แบบขนานด้วย allOf
ส่งคำขอไปยังปลายทางหลายแห่งพร้อมกัน จากนั้นรวบรวมการตอบกลับทั้งหมดเมื่อทุกคำขอเสร็จสิ้น
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();การหมดเวลาของการเรียก HTTP
ใช้ orTimeout กับการเรียก HTTP แบบอะซิงโครนัสโดยตรง เพื่อยกเลิกการเรียกหากเซิร์ฟเวอร์ใช้เวลานานเกินไป
CompletableFuture<String> result = client
.sendAsync(req, HttpResponse.BodyHandlers.ofString())
.orTimeout(5, TimeUnit.SECONDS)
.thenApply(HttpResponse::body)
.exceptionally(ex -> "timeout or error");การตรวจสอบรหัสสถานะในไปป์ไลน์
ใช้ thenApply เพื่อตรวจสอบรหัสสถานะ HTTP และโยนข้อยกเว้นเฉพาะโดเมนหากรหัสดังกล่าวบ่งชี้ถึงข้อผิดพลาด เพื่อให้การจัดการข้อผิดพลาดของไปป์ไลน์มีรูปแบบสอดคล้องกัน
.thenApply(response -> {
if (response.statusCode() != 200)
throw new HttpResponseException(response.statusCode());
return response.body();
})การรวมการกู้คืนข้อผิดพลาดกับการบันทึกเหตุการณ์
วาง whenComplete สำหรับการบันทึกเหตุการณ์ และ exceptionally สำหรับการกู้คืนไว้ในไปป์ไลน์เดียวกัน — ทั้งสองส่วนทำงานประกอบกันได้อย่างราบรื่น
fetchData()
.whenComplete((r, ex) -> { if (ex != null) log.error("Failed", ex); })
.exceptionally(ex -> fallback())
.thenAccept(result -> process(result));ตรวจสอบความเข้าใจ
เมธอดใดของ CompletableFuture ที่ถูกเรียก ONLY เมื่อฟิวเจอร์ล้มเหลว
สรุป
ใช้ exceptionally สำหรับค่าทดแทน ใช้ handle เพื่อแปลงผลลัพธ์ทั้งสองกรณี และใช้ whenComplete สำหรับผลข้างเคียง สร้างไปป์ไลน์ HTTP แบบอะซิงโครนัสด้วย Java 11 HttpClient + thenCompose + allOf
คำถามที่พบบ่อย
บทเรียน “การจัดการข้อผิดพลาดและไปป์ไลน์ HTTP แบบอะซิงโครนัส” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การจัดการข้อผิดพลาดและไปป์ไลน์ HTTP แบบอะซิงโครนัส” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Java Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Java Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การจัดการข้อผิดพลาดและไปป์ไลน์ HTTP แบบอะซิงโครนัส”
จัดการข้อผิดพลาดด้วย exceptionally, handle และ whenComplete จากนั้นสร้างไปป์ไลน์ไคลเอนต์ HTTP แบบอะซิงโครนัส คุณปฏิบัติ Java Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Java Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Java Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน
บทเรียน “การจัดการข้อผิดพลาดและไปป์ไลน์ HTTP แบบอะซิงโครนัส” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Java Academy นี้ได้ไหม
ได้ บทเรียน Java Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การสร้างและทำ CompletableFutures ให้เสร็จสมบูรณ์
- การเชื่อมต่อด้วย thenApply และ thenCompose
- การรวม Futures: allOf และ anyOf
- การจัดการข้อผิดพลาดและไปป์ไลน์ HTTP แบบอะซิงโครนัส