在 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.Future
与 java.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
,并且希望失败,您可以使用该方法。
自 Java9 起,如果您想返回已经失败的 future,还有 CompletableFuture.failedFuture(Throwable ex)
构造。
关于java - 如何使 java.util.concurrent.Future 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54757857/