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

标签 java vert.x completable-future

在 vertx 生态系统中,io.vertx.core.Future 的使用相当频繁: https://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 有关系,但看起来事实并非如此。 t。正如您所看到的,告诉 Vertx future 失败的方法是调用它的 failed() 方法。

另一方面,我们有 CompletableFuture,它是 java.util.concurrent.Future 接口(interface)的实现: 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 呢?

最佳答案

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

正如评论中提到的,还有 completeExceptionally() 方法,如果您手头有一个 Future ,并且希望失败,您可以使用该方法。

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

自 Java9 起,如果您想返回已经失败的 future,还有 CompletableFuture.failedFuture​(Throwable ex) 构造。

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

关于java - 如何使 java.util.concurrent.Future 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54757857/

相关文章:

java - Hibernate 和 MySQL 的创建时间戳和上次更新时间戳

java.lang.UnsupportedClassVersionError : io/vertx/core/Starter Error 错误

java - Vertx 3 - Java 序列化大对象

java - 如何在 Spring 中修改响应的 ReadOnlyHttpHeaders?

java - 每次加载类或找到资源时如何执行操作?

java - 将响应处理程序与 VertX 中的请求进行匹配

java - 在 Controller 中使用 @Async 和 CompletableFuture 可以提高我们 api 的性能吗?

java - 如何为 CompletableFuture::supplyAsync 选择执行器

java - 根据值映射验证 JsonNode 列表的最佳方法是什么?

java - 获取消息的当前可见性超时