我正在使用Java VertX框架,我正在尝试使用VertX WebClient和简单的HTTP请求加载多个JSON对象。我希望并行执行此操作,以加快处理速度。
我有一个Endpoint对象:
import io.vertx.core.Vertx;
import io.vertx.core.json.JsonObject;
import io.vertx.ext.web.client.WebClient;
import io.vertx.ext.web.codec.BodyCodec;
public final class Endpoint {
private final String name;
private final String url;
public Endpoint (String name, String url) {
this.name = name;
this.url = url;
}
public String getName() {
return name;
}
public String getUrl() {
return url;
}
public JsonObject loadJsonObject() {
WebClient client = WebClient.create(Vertx.vertx());
client.getAbs(this.getUrl()).as(BodyCodec.jsonObject()).send(handler -> {
// what to do
});
return null;
}
}
在另一个类中,我有以下函数应该并行处理(source):
public static void useCompletableFutureWithExecutor(List<Endpoint> tasks) {
long start = System.nanoTime();
ExecutorService executor = Executors.newFixedThreadPool(Math.min(tasks.size(), 10));
List<CompletableFuture<JsonObject>> futures =
tasks.stream()
.map(t -> CompletableFuture.supplyAsync(() -> t.loadJsonObject(), executor))
.collect(Collectors.toList());
List<JsonObject> result =
futures.stream()
.map(CompletableFuture::join)
.collect(Collectors.toList());
long duration = (System.nanoTime() - start) / 1_000_000;
System.out.printf("Processed %d tasks in %d millis\n", tasks.size(), duration);
System.out.println(result);
executor.shutdown();
}
我不知道如何继续这样做。 VertX WebClient强制我使用异步处理程序,这意味着我无法直接返回JsonObject。
答案 0 :(得分:1)
您的问题在方法签名中。而不是public JsonObject loadJsonObject() {
让我们从public Future<JsonObject> loadJsonObject() {
这意味着我们return null;
代替return future;
,而未来将被定义为Future<JsonObject> future = Future.future();
剩下的就是在数据到达时放入数据:
future.complete(result);
最终结果如下:
public Future<JsonObject> loadJsonObject() {
WebClient client = WebClient.create(Vertx.vertx());
Future<JsonObject> future = Future.future();
client.getAbs(this.getUrl()).as(BodyCodec.jsonObject()).send(handler -> {
// Do something with JSON and put in result
future.complete(result);
// Remember to future.fail() in case something went wrong
});
return future;
}
顺便说一句,你也可以使用CompositeFuture.all()
来等待你所有的未来。