Vert.x如何向cacheFirst传递未执行的Future避免任务提前触发
问题根因
Vert.x 中Future.future(Handler<Promise<T>> handler)方法被调用时,会立即执行传入的Handler内部逻辑。你在调用cacheFirst时直接实例化了Future对象,所以无论缓存是否命中,外部API调用逻辑都会提前执行,导致出现多余日志。
解决方案
核心思路是通过懒加载机制延迟Future的构造时机,仅在缓存未命中时才初始化并执行任务,修改步骤如下:
- 调整
cacheFirst方法的入参类型,将Future<String>替换为Supplier<Future<String>>,仅在缓存查询失败时调用Supplier的get()方法构造Future执行任务:
private Future<String> cacheFirst(String key, Supplier<Future<String>> taskSupplier) { Future<String> getCache = Future.future(h -> { h.complete("ABCXYZ"); }); return getCache.onSuccess(res -> { System.out.println("Data from cache: " + res); }).onFailure(t -> { // 缓存未命中时才触发任务执行 taskSupplier.get().onSuccess(res -> { System.out.println("Store task result to cache"); }).onFailure(tt -> { System.out.println("Do nothing"); }); }); }
- 修改
start方法中的调用逻辑,将原Future构造逻辑用Lambda表达式包装为Supplier传入:
cacheFirst("key", () -> Future.future(h -> { System.out.println("Call external API"); h.complete("Call external API"); })) .onComplete(h -> System.out.println("Success")) .onFailure(t -> System.out.println("Failed"));
修改后缓存命中时不会触发Supplier执行,自然不会运行外部API调用逻辑,控制台输出会和预期一致。
内容的提问来源于stack exchange,提问作者Trương Minh Triết
相关产品推荐
相关产品推荐

