2

我有一个用 Java 编写的 Play 2.1 控制器,我需要调用一个外部 Web 服务来获取一些数据。然后有了这个数据结果,我必须用 n 个调用调用另一个 Web 服务,对应于第一个 Web 服务调用的 n 个结果。

对于性能问题,我想使用 Promise 在单独的线程中进行 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 //...
      }
    }
  );}

如何同步 n 个承诺,然后使用 Async API 将结果减少到一个响应(所有结果的列表)中,然后仅在所有调用完成后才返回 http 响应?

无法知道调用次数使问题变得更加困难......(我不能将承诺声明为 promise1、promise2 等)

4

1 回答 1

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
  }
});
于 2013-04-29T22:53:35.367 回答