如何使java.util.concurrent.Future失败

时间:2019-02-19 02:04:50

标签: java vert.x completable-future

在vertx生态系统中大量使用io.vertx.core.Futurehttps://vertx.io/docs/apidocs/io/vertx/core/Future.html

使用Vertx Future的示例在这里:

private Future<Void> prepareDatabase() {

  Future<Void> future = Future.future();

  dbClient = JDBCClient.createShared(vertx, new JsonObject(...));

  dbClient.getConnection(ar -> {    

    if (ar.failed()) {
      LOGGER.error("Could not open a database connection", ar.cause());
      future.fail(ar.cause());  // here
      return; 
    } 

    SQLConnection connection = ar.result();   
    connection.execute(SQL_CREATE_PAGES_TABLE, create -> {
        connection.close();   
        if (create.failed()) {
          future.fail(create.cause());  // here
        } else {
          future.complete();  
        }
     });
  });

  return future;
}

我的印象是io.vertx.core.Futurejava.util.concurrent.Future有关,但似乎没有。如您所见,告诉Vertx未来失败的方法是调用它的fail()方法。

另一方面,我们有CompletableFuture,它是java.util.concurrent.Future接口的实现: https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CompletableFuture.html

我在CompletableFuture上看不到失败方法,我只看到“ resolve()”。

所以我的猜测是,使CompletableFuture失败的唯一方法是引发异常?

CompletableFuture<String> f = CompletableFuture.supplyAsync(() -> {
    throw new RuntimeException("fail this future");
    return "This would be the success result";
});

除了引发错误外,还有没有办法使CompletableFuture失败? 换句话说,使用Vertx Future,我们只调用f.fail(),但是使用CompletableFuture怎么办?

1 个答案:

答案 0 :(得分:1)

CompletableFuture鼓励您抛出supplyAsync()方法的异常来描述失败。

如评论中所述,还有一种completeExceptionally()方法,如果您手头有一个Future并希望失败,可以使用该方法。

https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CompletableFuture.html#completeExceptionally-java.lang.Throwable-

从Java9开始,如果您想返回已经失败的未来,那么还有CompletableFuture.failedFuture​(Throwable ex)构造。

https://docs.oracle.com/javase/9/docs/api/java/util/concurrent/CompletableFuture.html#failedFuture-java.lang.Throwable-