当前位置: 首页 > 知识库问答 >
问题:

VertX HTTP请求并行处理

贺宏逸
2023-03-14

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

}

在另一个类中,我有以下应该并行处理的函数(源代码):

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个答案

龚迪
2023-03-14

您的问题在于方法签名。让我们从public Future开始,而不是public JsonObject loadJsonObject(){

这意味着不是返回null,而是返回null

剩下的是在数据到达时放置数据:

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

 类似资料:
  • 并发请求处理 我创建了一个服务器,并使用s.listenandserve()来处理请求。据我所知,这些请求是同时送达的。我使用一个简单的处理程序来检查它: 我看到,如果我发送了几个请求,我将看到所有的“1”出现,只有在一秒钟后所有的“2”出现。但是如果删除Hibernate行,我会看到程序在完成前一个请求之前从不启动请求(输出为1 2 1 2 1 2...)。所以我不明白,如果它们是并发的还是不是

  • 我已经参考了这些链接,但仍然怀疑对singleton bean的并发请求是另一个不太相关的链接 我的问题/疑问:并行请求是否会由一个Spring单例bean[因为这只是一个对象/实例]并行/顺序处理?@Controller,@服务甚至在多核处理器上(并行线程执行能力) 希望不是,但它是如何工作的。 从第一个链接开始,我了解了一些东西——一个singleton bean对象,这个singleton

  • 我正在使用Spring Boot构建一个RESTful web服务。我的IDE是Eclipse Oxygen。 这里是我的控制器代码: 我的控制台输出是: 控制台输出显示每5秒调用一次控制器。但我每隔两秒就发送一次请求。 是否可以接受来自同一会话的并发多个请求? 谢谢!

  • 请求处理 fpm_run()执行后将fork出worker进程,worker进程返回main()中继续向下执行,后面的流程就是worker进程不断accept请求,然后执行PHP脚本并返回。整体流程如下: (1)等待请求: worker进程阻塞在fcgi_accept_request()等待请求; (2)解析请求: fastcgi请求到达后被worker接收,然后开始接收并解析请求数据,直到req

  • 从浏览器到我的自助主机OWIN WebAPI的所有预飞行请求都不会被中间件处理。如果我从邮递员提出选项请求,它们将被处理。为什么是这样的行为? 请求URL:http://localhost:9000/api/v1/conversations/create?connectionId=13509f44-eacb-4950-8cc8-71bd37098975 请求方法:选项 状态代码:401未经授权的远

  • 问题内容: 我有一个关于单例bean如何详细处理并发请求的问题。 我想要有关单例bean如何处理并发请求以及系统处理器如何看到这些请求的完整详细信息。 我已经研究了有关在线处理系统处理器中并发请求的问题。他们说处理器本身有一个调度程序,调度程序将决定处理哪个请求。 好的。如果假设我有多个核心处理器,那么调度程序如何处理并发请求? 谁能向我解释有关单例bean如何为JVM和系统中的并发请求提供服务的