gpt4 book ai didi

java - 对可变数量的对象使用 CompletableFuture.allOf

转载 作者:行者123 更新时间:2023-12-01 23:40:35 25 4
gpt4 key购买 nike

请耐心等待,我通常不使用 spring,也没有使用过较新版本的 java(我说较新,我指的是 1.4 版之后的任何版本)

无论如何,我遇到一个问题,我必须进行休息调用才能使用多个并行请求进行搜索。我在网上查了一下,我发现你可以使用 CompletableFuture。

所以我创建了我的方法来从其余调用中获取我需要的对象,例如:

@Async
public CompletableFuture<QueryObject[]> queryObjects(String url)
{
QueryObject[] objects= restTemplate.getForObject(url, QueryObject[].class);
return CompletableFuture.completedFuture(objects);
}

现在我需要用类似的东西来调用它:

CompletableFuture<QueryObject> page1 = QueryController.queryObjects("http://myrest.com/ids=[abc, def, ghi]);
CompletableFuture<QueryObject> page2 = QueryController.queryObjects("http://myrest.com/ids=[jkl, mno, pqr]);

我遇到的问题是该调用一次只需要执行三个 id,并且可能有一个可变编号 id 的列表。所以我解析 idlist 并创建一个像上面一样的查询字符串。我遇到的问题是,虽然我可以调用查询,但我没有可以调用 CompletableFuture.allOf 的单独对象。

谁能告诉我如何做到这一点?我已经这样做了一段时间了,但我没有比现在更进一步。如果上述内容还不够,很乐意提供更多信息

最佳答案

您并没有像现在那样使用 CompletableFuture 获得任何好处。

您使用的 restTemplate 方法是同步方法,因此它必须先完成并返回结果,然后才能继续。因此,将最终结果包装在 CompletableFuture 中不会导致它异步执行(也不会并行执行)。您只需包装一个已检索到的响应即可。

如果您想从异步执行中受益,那么您可以使用例如 AsyncRestTemplateWebClient .

简化的代码示例:

public ListenableFuture<ResponseEntity<QueryObject[]>> queryForObjects(String url) {
return asyncRestTemplate.getForEntity(url, QueryObject[].class);
}

public List<QueryObject> queryForList(String[] elements) {
return Arrays.stream(elements)
.map(element -> queryForObjects("http://myrest.com/ids=[" + element + "]"))
.map(future -> future.completable().join())
.filter(Objects::nonNull)
.map(HttpEntity::getBody)
.flatMap(Arrays::stream)
.collect(Collectors.toList());
}

关于java - 对可变数量的对象使用 CompletableFuture.allOf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58261362/

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