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

标签 java java-11 java-http-client

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

  • 这是不好的做法吗?
  • 每个 HttpRequest 都应该有自己的 HttpClient 吗?
  • 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 :

    Once built, an HttpClient can be used to send multiple requests.


    现在,您的问题可能与管理客户端的并发性有关。而不是使用 HttpClient 的相同实例,这与它使用的执行程序服务有很大关系,这是您可以自定义的(请参阅 here ):
    ExecutorService executorService = Executors.newFixedThreadPool(10);
    HttpClient httpClient  = HttpClient.newBuilder()
                                   .executor(executorService)
                                   ... //more config
                                   .build();
    
    通过这种方式,您可以管理客户端用于运行异步请求的线程池。
    换句话说:

    Is this bad practice?



    Should each HttpRequest have its own HttpClient?



    Is there an upper limit on the number of HttpRequests a HttpClient can have?


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

    关于Java 11 HttpClient - HttpClient 与并发 HttpRequest 的最佳比率是多少,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64302936/

    相关文章:

    java - 如何响应式下载和处理大数据?

    java - 找到一个名为 ".git/.MERGE_MSG.swp"的交换文件

    java - 为什么在 R 中安装包时出现错误?

    ubuntu-16.04 - SonarQube无法启动

    JavaFX Integer Spinner (IntegerSpinnerValueFactory) 不会将值环绕到最小值

    Java Streams - 使用 GroupingBy 收集到映射并进行计数,但如果特定字段为空则计数 0

    Java 11 HttpClient 不发送基本身份验证

    Java WebSocket 消息限制

    java - 摩尔斯电码转英语: ArrayIndexOutOfBoundsException

    java - 有没有办法在lotus notes文档中读取大文件附件时避免 "java.lang.OutOfMemoryError: Java heap space"?