Vertx 中的期货
Futures in Vertx
我有一个场景,我从 Handlers 得到 List<Future<String>>
,现在必须 return 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;
不确定你的意思,但列表的未来应该通过 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 );
}
}
});
我有一个场景,我从 Handlers 得到 List<Future<String>>
,现在必须 return 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;
不确定你的意思,但列表的未来应该通过 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 );
}
}
});