Java completeOnTimeout: ใส่ค่าสำรองเมื่องานช้าเกินเวลา
น้องกายEngineering
orTimeout ทำให้ future ล้มด้วย TimeoutException แต่บางครั้งผมอยากได้ค่าสำรองแทนการโยน error ครับ completeOnTimeout(value, timeout, unit) จะเติมค่านั้นเมื่อครบเวลา ถ้างานจริงเสร็จก่อน ค่าจริงชนะ
WHY: API ที่ช้าไม่ควรทำให้ทั้งท่อพัง
ใช้กับเรียกบริการภายนอกที่พอมีค่าเริ่มต้นให้แสดงชั่วคราวได้ เช่น ค่าคอนฟิกเก่าหรือผลว่าง ระวังว่าการ complete ฝั่ง timeout ไม่ได้ยกเลิกงานพื้นหลังให้อัตโนมัติ — ต้องออกแบบยกเลิกเองถ้าต้องการประหยัดทรัพยากร
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;
public class Main {
public static void main(String[] args) throws Exception {
CompletableFuture<String> slow = new CompletableFuture<>();
slow.completeOnTimeout("fallback", 50, TimeUnit.MILLISECONDS);
assert "fallback".equals(slow.get(1, TimeUnit.SECONDS));
CompletableFuture<String> fast = new CompletableFuture<>();
fast.completeOnTimeout("fallback", 200, TimeUnit.MILLISECONDS);
fast.complete("real");
assert "real".equals(fast.get(1, TimeUnit.SECONDS));
System.out.println("ok");
}
}
Recap
completeOnTimeoutใส่ค่าสำรองเมื่อหมดเวลา- ค่าที่ complete ก่อนชนะ
- งานพื้นหลังอาจยังรันต่อ — วางแผนยกเลิกแยกถ้าจำเป็น