Java8 CompletableFuture条件链接

时间:2017-03-15 04:28:19

标签: java concurrency java-8 completable-future

我已经阅读了很多java8可完成的未来教程,其中大部分基本相同。所有谈论一些基本方法“thenAccept”/“thenApply”/ thenCombine“来构建一个管道流。

但是当遇到真正的工作问题时,我觉得很难从不同的服务部门组织不同的可完成的未来。例如:

    interface Cache{
       CompletableFuture<Bean> getAsync(long id);
       CompletableFuture<Boolean> saveAsync(Bean bean);
    }


   interface DB{
       Completable<Bean> getAsync(long id)
    }

服务逻辑非常简单,从Cache获取数据,如果存在则返回给我们的客户端,如果不存在,则从DB获取,如果存在则将其保存回Cache,并将其返回给我们的客户端,如果DB中都不存在,将“错误”返回给客户。

使用同步API,它将非常直接。但是当使用asyncnorized API时,有“很多管道”,manny条件中断。我无法弄清楚如何使用CompletableFuture API来实现它。

1 个答案:

答案 0 :(得分:6)

如果您不关心保存到缓存中的结果,并且如果您想在未找到的bean上抛出异常,那么可能就是这样。

CompletableFuture<Bean> findBeanAsync(long id, Cache cache, DB db) {
    return cache.getAsync(id).thenCompose(bean -> {
        if (bean != null) {
            return CompletableFuture.completedFuture(bean);
        }
        return db.getAsync(id).thenApply(dbBean -> {
            if (dbBean == null) {
                throw new RuntimeException("bean not found with id " + id);
            }
            cache.saveAsync(dbBean);
            return dbBean;
        });
    });
}