【问题标题】:Running rest calls parallel in spring rest跑步休息与春季休息并行
【发布时间】:2023-01-23 22:43:07
【问题描述】:

我正在开发 Spring-Rest 应用程序,其中我们有一个请求(父请求),其中几乎没有请求(子请求(从 10-50 变化))。 我们必须使用这些子请求调用另一个 API 并接收我们必须集成到主响应(父响应)中的响应/请求(子响应)。 我能够针对这种情况进行编码,但问题是它花费了太多时间,这使得我们的 API 变慢了。 我正在寻找一种可以并行调用的方法,以便 API 可以更快地执行。

我已经将并行流与自定义线程一起使用,但我遇到的问题是我在执行操作时无法存储任何值

childRequests
    .prallelStream()
    .forEach((request) -> 
            {my logic to call other api and store result into childResponse }
    )

我得到“childResponse 需要是最终的或有效的最终”

【问题讨论】:

  • 您的“childResponse”是什么类型的?您的 childResponse 必须是最终有效的,因此在流操作之前初始化是正确的。但是你应该能够分配例如流之前的空 ConcurrentLinkedQueue 结果,并将所有可能的结果存储在其中。注意:您的结果列表应该支持并行交互,否则您可能会丢失并行交互的添加结果。
  • 我的 childResponses 也是一个自定义对象。

标签: java spring multithreading parallel-processing spring-rest


【解决方案1】:

在 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 完成后执行并返回一个包含操作结果的值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-30
    • 2013-03-23
    • 2015-03-15
    • 1970-01-01
    • 1970-01-01
    • 2013-12-13
    • 1970-01-01
    相关资源
    最近更新 更多