在下面的示例中,我创建一个 Java 11 httpClient,然后创建多个并发 HttpRequest。
- 这是不好的做法吗?
- 每个 HttpRequest 都应该有自己的 HttpClient 吗?
- HttpClient 可以拥有的 HttpRequest 数量是否有上限?
Code
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 文档HttpClient。但 HttpClient 应该被设计为处理多个请求。这在某种意义上隐含着Java HTTP 客户端简介:
构建后,HttpClient 可用于发送多个请求。
现在,您的问题可能是关于管理客户端的并发性。而不是使用相同的实例HttpClient
,这与它使用的执行器服务有很大关系,这是您可以自定义的(请参阅here):
ExecutorService executorService = Executors.newFixedThreadPool(10);
HttpClient httpClient = HttpClient.newBuilder()
.executor(executorService)
... //more config
.build();
这样,您可以管理客户端用于运行异步请求的线程池。
换句话说:
这是不好的做法吗?
No
每个 HttpRequest 都应该有自己的 HttpClient 吗?
No
HttpClient 可以拥有的 HttpRequest 数量是否有上限?
您必须测试应用程序的最佳并发设置,然后使用相应配置的执行程序服务。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)