gpt4 book ai didi

java - 如何使用 AsyncRestTemplate 同时调用多个电话?

转载 作者:IT老高 更新时间:2023-10-28 13:52:39 30 4
gpt4 key购买 nike

我不明白如何有效地使用 AsyncRestTemplate 进行外部服务调用。下面的代码:

class Foo {

public void doStuff() {
Future<ResponseEntity<String>> future1 = asyncRestTemplate.getForEntity(
url1, String.class);
String response1 = future1.get();

Future<ResponseEntity<String>> future2 = asyncRestTemplate.getForEntity(
url2, String.class);
String response2 = future2.get();

Future<ResponseEntity<String>> future3 = asyncRestTemplate.getForEntity(
url3, String.class);
String response3 = future3.get();
}
}

理想情况下,我希望同时执行所有 3 个调用,并在它们全部完成后处理结果。 然而在调用 get()get()< 之前,不会获取每个外部服务调用 被阻止。那么这不是破坏了 AsyncRestTemplate 的目的吗?我不妨使用 RestTemplate

所以我不明白如何让它们同时执行?

最佳答案

在调度所有异步调用之前不要调用阻塞 get():

class Foo {
public void doStuff() {
ListenableFuture<ResponseEntity<String>> future1 = asyncRestTemplate
.getForEntity(url1, String.class);
ListenableFuture<ResponseEntity<String>> future2 = asyncRestTemplate
.getForEntity(url2, String.class);
ListenableFuture<ResponseEntity<String>> future3 = asyncRestTemplate
.getForEntity(url3, String.class);

String response1 = future1.get();
String response2 = future2.get();
String response3 = future3.get();
}
}

您可以在循环中同时执行 dispatchget,但请注意,当前的结果收集效率低下,因为它会卡在下一个未完成的 future 。

您可以将所有 future 添加到一个集合中,并对其进行迭代,以测试每个 future 的非阻塞 isDone()。当该调用返回 true 时,您可以调用 get()

这样,您的集体结果收集将得到优化,而不是按照调用 get()s 的顺序等待下一个缓慢的 future 结果。

您还可以在 AccyncRestTemplate 返回的每个 ListenableFuture 中注册回调(运行时),并且您不必担心循环检查潜在结果。

关于java - 如何使用 AsyncRestTemplate 同时调用多个电话?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35214384/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com