首页 > 解决方案 > Java 11 HttpClient - HttpClients 与并发 HttpRequests 的最佳比率是多少

问题描述

在下面的示例中,我创建了一个 Java 11 httpClient,然后创建了多个并发 HttpRequest。

  1. 这是不好的做法吗?
  2. 每个 HttpRequest 都应该有自己的 HttpClient 吗?
  3. HttpClient 可以拥有的 HttpRequest 数量是否有上限?

代码

    private static void httpClientExample(){
    
    HttpClient httpClient = HttpClient.newHttpClient();

    System.out.println("TP1");

    var task1 = httpClient.sendAsync(HttpRequest.newBuilder()
            .uri(URI.create("https://www.bing.com/"))
            .build(), HttpResponse.BodyHandlers.ofString())
            .thenApply(HttpResponse::uri).thenAccept(System.out::println);

    var task2 = httpClient.sendAsync(HttpRequest.newBuilder()
            .uri(URI.create("https://openjdk.java.net/"))
            .build(), HttpResponse.BodyHandlers.ofString())
            .thenApply(HttpResponse::uri).thenAccept(System.out::println);
    
    var task3 = httpClient.sendAsync(HttpRequest.newBuilder()
            .uri(URI.create("https://www.google.co.uk/"))
            .build(), HttpResponse.BodyHandlers.ofString())
            .thenApply(HttpResponse::uri).thenAccept(System.out::println);


    System.out.println("Requests Sent");

    try {
        Thread.sleep(5000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

    System.out.println("Main Thread Completed");
    }

标签: javajava-11java-http-client

解决方案


这没有明确记录HttpClient. 但预计 HttpClient 旨在处理多个请求。这在某种意义上暗示了 Java HTTP 客户端简介

构建后,可以使用 HttpClient 发送多个请求。

现在,您的问题可能是关于管理客户端的并发性。这与使用的 executor 服务有很大关系,而不是使用相同的实例HttpClient,这是您可以自定义的(参见此处):

ExecutorService executorService = Executors.newFixedThreadPool(10);
HttpClient httpClient  = HttpClient.newBuilder()
                               .executor(executorService)
                               ... //more config
                               .build();

这样,您可以管理客户端用于运行异步请求的线程池。

换句话说:

这是不好的做法吗?

每个 HttpRequest 都应该有自己的 HttpClient 吗?

HttpClient 可以拥有的 HttpRequest 数量是否有上限?

您必须测试应用程序的最佳并发设置,然后使用相应配置的执行器服务。


推荐阅读