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

Java 11 HttpClient - What is Optimum Ratio of HttpClients to Concurrent HttpRequests(Java 11 HttpClient-HttpClients与并发HttpRequest的最佳比率是多少)

本文介绍了Java 11 HttpClient-HttpClients与并发HttpRequest的最佳比率是多少的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在下面的示例中,我创建了一个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 11 HttpClient-HttpClients与并发HttpRequest的最佳比率是多少的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本文标题为:Java 11 HttpClient-HttpClients与并发HttpRequest的最佳比率是多少