在 Spring 中,您可以使用 CompletableFuture 类并行运行 REST 调用。下面是一个示例,说明如何使用 CompletableFuture 并行运行两个 REST 调用并合并它们的结果:
@RestController
公共类 RestCallController {
@Autowired
private RestTemplate restTemplate;
@GetMapping("/rest-calls")
public String restCalls() throws InterruptedException, ExecutionException {
String url1 = "https://jsonplaceholder.typicode.com/posts/1";
String url2 = "https://jsonplaceholder.typicode.com/posts/2";
CompletableFuture<ResponseEntity<String>> future1 = CompletableFuture.supplyAsync(() ->
restTemplate.getForEntity(url1, String.class));
CompletableFuture<ResponseEntity<String>> future2 = CompletableFuture.supplyAsync(() ->
restTemplate.getForEntity(url2, String.class));
CompletableFuture.allOf(future1, future2).join();
return "First call result: " + future1.get().getBody() + "
Second call result: " + future2.get().getBody();
}
}
在此示例中,CompletableFuture.supplyAsync() 方法用于异步运行 REST 调用,而 CompletableFuture.allOf() 方法用于等待两个调用完成。一旦两个调用都完成,它们的结果将被合并并返回给客户端。
重要的是要注意 CompletableFuture.allOf() 方法不返回任何值,它仅在所有作为参数传递的 CompletableFutures 完成时才完成。
您还可以使用 CompletableFuture.anyOf() 方法,该方法返回一个 CompletableFuture,当作为参数传递的任何 CompletableFuture 完成时,该方法将完成。
您还可以使用 CompletableFuture.runAsync() 方法,它是运行任务且不返回值的 supplyAsync 方法的简单版本。
您还可以使用 CompletableFuture.thenCombine() 方法,该方法允许您合并两个 completableFuture 的结果。
您可以使用 CompletableFuture.whenComplete() 方法附加一个回调,该回调在 completableFuture 完成后执行。
您可以使用 CompletableFuture.handle() 方法附加一个回调,该回调在 completableFuture 完成后执行并返回一个包含操作结果的值。