在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
有关,但似乎没有。如您所见,告诉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怎么办?
答案 0 :(得分:1)
CompletableFuture
鼓励您抛出supplyAsync()
方法的异常来描述失败。
如评论中所述,还有一种completeExceptionally()
方法,如果您手头有一个Future
并希望失败,可以使用该方法。
从Java9开始,如果您想返回已经失败的未来,那么还有CompletableFuture.failedFuture(Throwable ex)
构造。