VertX HTTP请求并行处理

时间:2017-09-21 14:29:10

标签: json parallel-processing java-8 stream vert.x

我正在使用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。

1 个答案:

答案 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()来等待你所有的未来。

http://vertx.io/docs/vertx-core/java/#_async_coordination