问题描述
在下面的示例中,我创建了一个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:
构建后,HttpClient可用于发送多个请求。
现在,您的问题可能是关于管理客户端上的并发性。与使用相同的HttpClient实例不同,这与它使用的Executor服务有很大关系,您可以自定义该服务(请参见here):
ExecutorService executorService = Executors.newFixedThreadPool(10); HttpClient httpClient = HttpClient.newBuilder() .executor(executorService) ... //more config .build();
通过这种方式,您可以管理客户端用于运行异步请求的线程池。
换言之:
这是不好的做法吗?
否
每个HttpRequest都应该有自己的HttpClient吗?
否
HttpClient可以拥有的HttpRequest数有上限吗?
您必须测试应用程序的最佳并发设置,然后使用相应配置的Executor服务。