首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java发送多个HTTP请求的最佳方法

Java发送多个HTTP请求的最佳方法
EN

Stack Overflow用户
提问于 2021-08-09 12:17:30
回答 1查看 3.3K关注 0票数 1

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

代码语言:javascript
复制
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()),如果是,我如何才能这样做。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-08-09 12:51:40

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

使用GET的简单示例:

代码语言:javascript
复制
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();

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

代码语言:javascript
复制
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没有帮助,因为它实际上返回了一个空值。

static CompletableFuture allOf(CompletableFuture<?>.( cfs)

返回一个在所有给定的CompletableFuture都完成时完成的新CompletableFutures。

相反,您仍然可以使用join,但是以不同的方式使用:

代码语言:javascript
复制
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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68711922

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档