Фьючерсы в Vertx - PullRequest
       26

Фьючерсы в Vertx

0 голосов
/ 26 апреля 2020

У меня есть сценарий, в котором я получаю List<Future<String>> от обработчиков и теперь должен вернуть Future<List<String>>. Почему выходные данные всегда пусты, хотя я проверяю все фьючерсы после их завершения.

Future<List<String>> output = Future.future();
List futures =
    services.entrySet().stream()
        .map(
            entry -> {
              Future future = Future.future();
              webClient
                  .getAbs(entry.getKey())
                  .timeout(1000)
                  .send(
                      ar -> {
                        if (ar.succeeded()) {
                          if (ar.result().statusCode() == HttpResponseStatus.OK.code()) {
                            services.put(entry.getKey(), "OK");
                            future.complete(entry.getKey());
                          }
                        } else {
                          services.put(entry.getKey(), "Failed");
                          future.fail(ar.cause());
                        }
                      });
              return future;
            })
        .collect(Collectors.toList());

CompositeFuture.join(futures)
    .setHandler(
        ar -> {
          futures.forEach(
              fut -> {
                okServices.add(fut.toString());
              });
        });
output.complete(okServices);
System.out.println(output.result());
return output;

1 Ответ

1 голос
/ 26 апреля 2020

Не уверен, что вы имели в виду, но Future of List должен быть реализован через CompositeFuture https://vertx.io/docs/vertx-core/java/#_async_coordination

Я бы поставил ваш код так:

List<Future<String>> futures = services.entrySet().stream().map( entry -> { 
  Future future = Future.future(); 
  WebClient.getAbs(entry.getKey()).send( future ); 
  return future;
} ).collect(toList);

CompositeFuture.join(futures).onComplete(ar -> {
  futures.forEach( fut -> {
    if (fut.succeeded()) {
      log.info( "succeeded " + fut );
    } else {
      log.warn( "failed " + fut );
    }
  }
});
...