【问题标题】:Play2 calling multiple webservices with AsyncResult (Java)Play2 使用 AsyncResult (Java) 调用多个 Web 服务
【发布时间】:2013-04-23 08:55:25
【问题描述】:

我有一个用 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 个 promise,然后使用 Async API 将结果减少到一个响应(所有结果的列表)中,然后仅在所有调用完成后才返回 http 响应?

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

【问题讨论】:

    标签: java playframework promise


    【解决方案1】:

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

    【讨论】:

    • 谢谢詹姆斯,这正是我所需要的! Scala Iteratee API 中的“waitAll”是什么?
    • waitAll 混淆名称已解决,现在方法名为“sequence”:)
    • 由于 iteratee 是消费者,他们从他们所消费的东西中产生结果,而不是未来的值,所以 waitAll 或对多个 iteratee 进行排序实际上没有意义。但是,例如,您可以使用 Enumeratee.zip 或 Enumeratee.zipWith,让两个迭代器使用相同的流,并生成它们结果的元组。
    猜你喜欢
    • 2013-02-02
    • 1970-01-01
    • 1970-01-01
    • 2016-10-14
    • 1970-01-01
    • 2014-05-04
    • 2016-09-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多