用户登录
用户注册

分享至

Java 11 HttpClient-HttpClients与并发HttpRequest的最佳比率是多少

  • 作者: 浮生若梦
  • 来源: 51数据库
  • 2022-10-19

问题描述

在下面的示例中,我创建了一个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");
    }

推荐答案

API docs of HttpClient中没有明确记录这一点。但可以预料到,HttpClient被设计为处理多个请求。这在某种意义上暗示了Introduction to the Java HTTP Client:

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

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

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

通过这种方式,您可以管理客户端用于运行异步请求的线程池。

换言之:

这是不好的做法吗?

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

HttpClient可以拥有的HttpRequest数有上限吗?

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

软件
前端设计
程序设计
Java相关