多线程调用restTemplate例子
时间: 2023-10-03 14:11:12 浏览: 124
SpringBoot系列之RestTemplate使用示例
5星 · 资源好评率100%
下面是一个使用多线程调用 RestTemplate 的示例代码:
```java
RestTemplate restTemplate = new RestTemplate();
String url = "https://example.com/api/user/{id}";
ExecutorService executor = Executors.newFixedThreadPool(10);
List<CompletableFuture<User>> futures = new ArrayList<>();
for (int i = 0; i < 100; i++) {
CompletableFuture<User> future = CompletableFuture.supplyAsync(() -> {
User user = restTemplate.getForObject(url, User.class, i);
return user;
}, executor);
futures.add(future);
}
CompletableFuture<Void> allFutures = CompletableFuture.allOf(
futures.toArray(new CompletableFuture[0]));
allFutures.thenRun(() -> {
List<User> users = futures.stream()
.map(CompletableFuture::join)
.collect(Collectors.toList());
System.out.println("All users: " + users);
});
executor.shutdown();
```
在这个示例中,我们首先创建了一个 RestTemplate 的实例,并定义了一个请求的 URL,其中 `{id}` 表示需要替换成实际的用户 ID。
接着,我们使用 Executors.newFixedThreadPool 方法创建了一个线程池,其中线程池的大小为 10。然后,我们使用一个 for 循环创建了 100 个 CompletableFuture 对象,每个 CompletableFuture 对象都会在一个单独的线程中执行。在 CompletableFuture 的 Supplier 接口中,我们使用 RestTemplate 发送了一个 GET 请求,并将响应转换成了 User 对象。
接下来,我们使用 CompletableFuture.allOf 方法创建了一个新的 CompletableFuture 对象,它会等待所有的 CompletableFuture 对象都完成后再执行。在 CompletableFuture 完成后,我们使用 stream 和 map 方法将 CompletableFuture 对象转换成 User 对象,并将它们收集到一个 List 中。最后,我们打印所有的 User 对象。
需要注意的是,在使用多线程调用 RestTemplate 时,需要注意线程池的大小和请求的并发量,过大会导致资源浪费,过小会导致请求堆积。另外,如果 RestTemplate 的配置不正确,可能会导致线程阻塞或请求失败,需要进行适当的配置和异常处理。
阅读全文