我在Java中有一个Play 2.1控制器,我需要调用外部Web服务来获取一些数据。然后使用此数据结果,我必须使用n次调用调用另一个Web服务,该调用对应于第一次webservice调用的n个结果。
对于性能问题,我想使用promises在分离的线程中进行n次调用。
所以我会有这样的循环:
List<String> firstResults = WS.url("http://...") ///...blablabla
for(String keyword : firstResults){
Promise<ResultType> promise = play.libs.Akka.future(
new Callable<ResultType>() {
public Integer call() {
return //...
}
}
);}
如何使用Async API同步n个promises然后在一个响应(所有结果的列表)中减少结果,然后仅在所有调用完成后返回http响应?
无法知道通话次数会使问题变得更加困难......(我不能将承诺声明为promise1,promise2等。)
答案 0 :(得分:4)
Promise.waitAll就是你想要的:
List<String> firstResults = WS.url("http://...") ///...blablabla
List<Promise<? extends ResultType>> webServiceCalls = new ArrayList<>;
for(String keyword : firstResults){
Promise<ResultType> promise = WS.url("http://...?keyboard=" + keyword).get().map(
// function of Response to ResultType
);
webServiceCalls.add(promise);
}
// Don't be confused by the name here, it's not actually waiting
Promise<List<ResultType>> results = Promise.waitAll(webServiceCalls);
return async(results.map(new Function<List<ResultType, Result>>() {
public Result apply(List<ResultType> results) {
// Convert results to ResultType
}
});