0Pricing
Java Academy · บทเรียน

การจัดการข้อผิดพลาดและไปป์ไลน์ 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 failed

handle: แปลงผลลัพธ์ทั้งกรณีสำเร็จและล้มเหลว

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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การสร้างและทำ CompletableFutures ให้เสร็จสมบูรณ์
  2. การเชื่อมต่อด้วย thenApply และ thenCompose
  3. การรวม Futures: allOf และ anyOf
  4. การจัดการข้อผิดพลาดและไปป์ไลน์ HTTP แบบอะซิงโครนัส
← กลับไปที่ Java Academy