我有一个场景,我得到 List<Future<String>>
来自处理程序,现在必须返回 Future<List<String>>
。
尽管我在完成后检查所有 future,但为什么输出始终为空。
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;
最佳答案
不确定你的意思,但列表的 future 应该通过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 );
}
}
});
关于java - Vertx future ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61434963/