2013-04-29 82 views
2

我在Java中有一个Play 2.1控制器,我需要调用外部web服务来获取一些数据。然后用这个数据结果,我必须调用另一个带有n个调用的Web服务,与第一个Web服务调用的n个结果相对应。Play2使用AsyncResult(Java)调用多个webservices

对于性能问题,我想使用承诺在分离的线程中进行n个调用。

所以我有这样一个循环:使用异步API

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 //... 
     } 
    } 
);} 

如何同步n个承诺,然后降低一个响应(所有结果的列表)的结果,然后返回只有在所有呼叫完成后才回应http响应?

不能够知道呼叫的数量使问题更加困难......(我不能宣布承诺为promise1,promise2等)

回答

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 
    } 
}); 
+0

谢谢詹姆斯,这正是我所需要的! Scala Iteratee API中等效于“waitAll”的是什么? – Loic 2013-04-30 06:59:02

+2

waitAll令人困惑的名字已解决,现在该方法被命名为“sequence”:) – Loic 2013-04-30 13:23:58

+0

由于iteratees是从消费者产生结果的消费者,而不是将来的值,所以waitAll或序列并没有意义一些迭代。但是,例如,您可以使用Enumeratee.zip或Enumeratee.zipWith来使两个迭代消耗相同的流,并生成其结果的元组。 – 2013-05-01 03:48:43