Мы используем Futures в vertx в примерах вроде:
Future<JsonObject> fetchVehicle = getUserBookedVehicle(routingContext, client);
fetchVehicle.compose(vehicleJson -> vehicleDoor(routingContext, client, vehicleJson, lock)).setHandler(
asyncResult -> {
if (asyncResult.succeeded()) {
LOG.info("Door operation succeeded with result {}", asyncResult.result().encode());
handler.handle(Future.succeededFuture(new AsyncReply(200, "OK")));
}
else {
handler.handle(Future.failedFuture(asyncResult.cause()));
}
});
где мы обрабатываем 2 вызова, например.
ИЛИ У меня есть другой фрагмент, где я могу обработать любое количество методов:
List<Future> futures = new ArrayList<>();
conversation.getRequestList().forEach(req -> {
Future<Message<Object>> senderFuture = Future.future();
vertx.eventBus().send(AbstractOEMClientVerticle.ADDRESS, JsonObject.mapFrom(req), deliveryOptions, senderFuture.completer());
// sent successfully. save the replyAddress and the conversation for later/callback
log.info("Saving the conversation for the request.", conversation.getReplyAddress());
pendingCommands.put(req.getBody().getString(MSG_ID), conversation);
futures.add(senderFuture);
});
CompositeFuture.all(futures).setHandler(ar -> {
if (ar.succeeded()) {
handler.handle(Future.succeededFuture());
} else {
log.error("forwardToVWClient VW got result : {}", ar.cause());
handler.handle(Future.failedFuture(ar.cause()));
}
});
Здесь мы объединяем все запросы в conversation.getRequestList()
, не зная заранее их количества.
Но недостатком метода .all()
является то, что у нас нет контроля над заказом.
Как я могу связать любое количество методов с Vertx Futures (не зная точного количества вызовов)?
РЕДАКТИРОВАТЬ:
Официальное руководство говорит о последовательной композиции, но в приведенном примере есть 3 вызова. Это не объясняет, как это сделать для произвольного количества звонков.
См. «Последовательная композиция» в http://vertx.io/docs/vertx-core/java/
Надеюсь, это понятно.