You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vert.x如何向cacheFirst传递未执行的Future避免任务提前触发

问题根因

Vert.x 中Future.future(Handler<Promise<T>> handler)方法被调用时,会立即执行传入的Handler内部逻辑。你在调用cacheFirst时直接实例化了Future对象,所以无论缓存是否命中,外部API调用逻辑都会提前执行,导致出现多余日志。

解决方案

核心思路是通过懒加载机制延迟Future的构造时机,仅在缓存未命中时才初始化并执行任务,修改步骤如下:

  1. 调整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");
      });
    });
}
  1. 修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 09:00:00