Play2使用AsyncResult(Java)调用多个Web服务
我有一个Java的Play2.1控制器,我需要调用一个外部Web服务来获取一些数据。然后使用这个数据结果,我必须用n个调用调用另一个web服务,对应于第一个web服务调用的n个结果 对于性能问题,我希望使用承诺在分离的线程中进行n次调用 所以我会有一个这样的循环: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
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,让两个迭代对象使用相同的流,并生成其结果的元组。