【问题标题】:Java best way to send multiple HTTP requestsJava 发送多个 HTTP 请求的最佳方式
【发布时间】:2021-08-09 12:17:30
【问题描述】:

我有一个 Java 程序,它使用 Java 11 HttpClient 向服务器发送数百个 GET 请求,它需要每分钟执行 2-3 次。目前,它执行以下操作(仅描述逻辑):

for each request that needs to be sent:

    //build GET request
    CompletableFuture<HttpResponse<String>> future = client.sendAsync(request, HttpResponse.BodyHandlers.ofString());
    futures.add(future)
    // for every 100 request, sleep for 2500 milliseconds (to wait for responses)

for each future in futures:
    // parse JSON response

代码大部分工作正常,但是,它受到互联网连接强度的严重影响,好像它很糟糕,80% 的请求没有得到响应,因为等待时间不够。

问题是这是否是正确的方法,如果不是,它会是什么。另外,我是否应该等待所有请求得到响应(例如同步发送请求并使用 .join()),如果是,我该怎么做。

【问题讨论】:

  • 你需要睡觉吗?那会阻塞线程。你可以直接发出你的请求然后忘记吗?所以解雇所有 100 个,还是调用相互依赖?
  • @SusanMustafa 我正在使用 sleep 来等待请求的响应,否则他们将没有时间得到响应

标签: java http asynchronous get connectivity


【解决方案1】:

如果您的所有 API 调用都是独立的,那么您可以先触发,然后再加入结果。

使用 GET 的简单示例:

List<URI> uris  = ... //

HttpClient client = HttpClient.newHttpClient();
List<HttpRequest> requests = uris.stream()
        .map(HttpRequest::newBuilder)
        .map(reqBuilder -> reqBuilder.build())
        .collect(toList());

CompletableFuture.allOf(requests.stream()
        .map(request -> client.sendAsync(request, ofString()))
        .toArray(CompletableFuture<?>[]::new))
        .join();

您也可以从使用自定义执行器中受益:

private static final ExecutorService executorService = Executors.newFixedThreadPool(5);

private static final HttpClient httpClient = HttpClient.newBuilder()
        .executor(executorService)
        .version(HttpClient.Version.HTTP_2)
        .connectTimeout(Duration.ofSeconds(10))
        .build();

已编辑----

如果你想要结果,那么 allOf 没有帮助,因为它实际上返回了一个 VOID。

静态 CompletableFuture allOf(CompletableFuture>...cfs)

返回一个新的 CompletableFuture,当所有的 给定 CompletableFutures 完成。

您仍然可以使用 join,但方式不同:

List<CompleteFuture<HttpResponse<String>> listOfCompletableFutures = ...

     listOfCompletableFutures.
    .stream()
    .map(CompletableFuture::join)
    .filter(Objects::nonNull)
    .collect(Collectors.toList());

好的参考:

https://openjdk.java.net/groups/net/httpclient/recipes.html

Java 11 HttpClient - What is Optimum Ratio of HttpClients to Concurrent HttpRequests

https://mkyong.com/java/java-11-httpclient-examples/

Java collecting results of CompletableFuture from multiple calls

【讨论】:

  • 谢谢你,这帮助很大。最后一个问题:如果我需要处理响应正文(解析 JSON),我在哪里做呢?加入后?
  • 请查看编辑后的答案是否对您有帮助,请更新! :)
猜你喜欢
  • 2021-07-12
  • 2021-02-25
  • 2013-12-05
  • 2013-06-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多