【发布时间】:2018-12-10 21:03:22
【问题描述】:
我正在尝试循环调用 PUT 请求的 rest api。每个电话都是一个CompletableFuture。每个 api 调用都返回一个 RoomTypes.RoomType 类型的对象
我想收集响应(成功和错误) 响应)在不同的列表中。我该如何做到这一点?我确定我 不能使用
allOf,因为如果有的话,它不会得到所有的结果 一次调用更新失败。如何记录每次调用的错误/异常?
public void sendRequestsAsync(Map<Integer, List> map1) {
List<CompletableFuture<Void>> completableFutures = new ArrayList<>(); //List to hold all the completable futures
List<RoomTypes.RoomType> responses = new ArrayList<>(); //List for responses
ExecutorService yourOwnExecutor = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
for (Map.Entry<Integer, List> entry :map1.entrySet()) {
CompletableFuture requestCompletableFuture = CompletableFuture
.supplyAsync(
() ->
//API call which returns object of type RoomTypes.RoomType
updateService.updateRoom(51,33,759,entry.getKey(),
new RoomTypes.RoomType(entry.getKey(),map2.get(entry.getKey()),
entry.getValue())),
yourOwnExecutor
)//Supply the task you wanna run, in your case http request
.thenApply(responses::add);
completableFutures.add(requestCompletableFuture);
}
【问题讨论】:
-
首先,不要在像
ArrayList这样的非线程安全集合上使用thenApply(responses::add),因为它可能会破坏集合结构。此外,allOf实际上等待所有成功/失败,但文档在这一点上可能不是很明确(我自己实际测试过)。 -
@DidierL “等待”是什么意思?我刚刚尝试过,我可以看到,只要集合中的一个可完成 Future 产生异常,
allOf返回的可完成 Future 就会调用下一个阶段方法(例如handle)。 -
@EdwinDalorzo 在我的测试中并非如此:它等到最后一个未来完成。也许这取决于你做什么,但这会令人惊讶。
-
@DidierL 当你说“等待”时,你的意思是在所有未来成功或不成功解决之前不会调用可计算未来的下一个阶段方法?跨度>
-
@EdwinDalorzo 确实,是的:
allOf阶段只有在所有期货都完成后才能完成,即使有些失败的冷杉 - AFAICT。
标签: java multithreading asynchronous java-8 completable-future