具有异常处理功能的CompletableFuture链

时间:2018-08-31 17:59:20

标签: java completable-future

我正在尝试组成一系列步骤,以便通过创建以诸如此类的方式返回if的方法来避免大量的elseCompletableFuture<Boolean>嵌套调用。 ...

client.connect(identifier).thenCompose(b -> client.authenticate())
                           .thenCompose(b -> client.sendSetting(settings))
                           .thenCompose(b -> client.saveSettings())
                           .thenCompose(b -> client.sendKey(key))
                           .thenCompose(b -> client.setBypassMode(true))
                           .thenCompose(b -> client.start())
                           .whenComplete((success, ex) -> {
                                 if(ex == null) {
                                     System.out.println("Yay");  
                                 } else {
                                     System.out.println("Nay");   
                                 }
                           });

如果客户端方法返回CompletableFuture<Boolean>来决定是否必须在链中的每个lambda中进行处理,并且不提供在其中一个调用失败的情况下提前中止的方法。我宁愿让调用返回CompletableFuture<Void>并使用Exceptions来控制是否1)执行该链中的每个后续步骤,以及2)最终确定整个链的成功。

我很难找到CompletableFuture<Void>上的哪个方法可以交换为thenCompose以使事情正常工作(更不用说编译了)。

1 个答案:

答案 0 :(得分:0)

public class FutureChaings {
    public static CompletableFuture<Void> op(boolean fail) {
        CompletableFuture<Void> future = new CompletableFuture<Void>();
        System.out.println("op");
        Executors.newScheduledThreadPool(1).schedule(() -> {
            if(fail) {
                future.completeExceptionally(new Exception());
            }
            future.complete(null);          
        }, 1, TimeUnit.SECONDS); 

        return future;
    }


    public static void main(String[] args) {
        op(false).thenCompose(b -> op(false)).thenCompose(b -> op(true)).whenComplete((b, ex) -> {
            if(ex != null) {
                System.out.println("fail");
            } else {
                System.out.println("success");
            }
        });
    }
}

我能够设计出一个符合我想要的方式的示例。所以我知道召集什么才能得到我想要的东西。现在找出在我的真实代码中编译器不喜欢的东西。感谢您的评论。