Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Play2使用AsyncResult(Java)调用多个Web服务_Java_Playframework_Promise - Fatal编程技术网

Play2使用AsyncResult(Java)调用多个Web服务

Play2使用AsyncResult(Java)调用多个Web服务,java,playframework,promise,Java,Playframework,Promise,我有一个Java的Play2.1控制器,我需要调用一个外部Web服务来获取一些数据。然后使用这个数据结果,我必须用n个调用调用另一个web服务,对应于第一个web服务调用的n个结果 对于性能问题,我希望使用承诺在分离的线程中进行n次调用 所以我会有一个这样的循环: List<String> firstResults = WS.url("http://...") ///...blablabla for(String keyword : firstResults){ Promise

我有一个Java的Play2.1控制器,我需要调用一个外部Web服务来获取一些数据。然后使用这个数据结果,我必须用n个调用调用另一个web服务,对应于第一个web服务调用的n个结果

对于性能问题,我希望使用承诺在分离的线程中进行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 //...
      }
    }
  );}
List firstResults=WS.url(“http://...)///…等等
for(字符串关键字:firstResults){
允诺允诺=play.libs.Akka.future(
新的可调用(){
公共整数调用(){
返回/。。。
}
}
);}
如何使用异步API同步n承诺,然后在一个响应(所有结果的列表)中减少结果,然后仅在所有调用完成时返回http响应


无法知道呼叫的数量会使问题更加困难。。。(我不能将承诺声明为允诺人1、允诺人2等)

承诺。等待就是你想要的:

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
  }
});
List firstResults=WS.url(“http://...)///…等等

ListPromise.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
  }
});
List firstResults=WS.url(“http://...)///…等等

谢谢詹姆斯,这正是我需要的!Scala Iteratee API中“waitAll”的等价物是什么?waitAll混淆的名称已经解决,现在该方法被命名为“sequence”:)由于迭代者是消费者,他们根据自己消费的内容生成结果,而不是未来的值,因此对许多迭代者进行waitAll或sequence实际上没有意义。但是,例如,您可以使用Enumerate.zip或Enumerate.zipWith,让两个迭代对象使用相同的流,并生成其结果的元组。谢谢James,这正是我所需要的!Scala Iteratee API中“waitAll”的等价物是什么?waitAll混淆的名称已经解决,现在该方法被命名为“sequence”:)由于迭代者是消费者,他们根据自己消费的内容生成结果,而不是未来的值,因此对许多迭代者进行waitAll或sequence实际上没有意义。但是,例如,您可以使用Enumerate.zip或Enumerate.zipWith,让两个迭代对象使用相同的流,并生成其结果的元组。