如何跟踪未知数量的异步Web服务请求

时间:2014-08-14 07:11:55

标签: playframework

我想要实现以下场景:

我按照用户列表,每个人都按照其他用户列表(想想Twitter)。我想做以下事情:

  • 给定特定用户,让所有用户关注
  • x人列表中,并行提出x个请求,以获取他们关注的人员列表

在Play中,我想通过WS API执行此操作,并且我猜测当我并行地发出x个请求时,我会有x Future对象表示每个请求的结果那些电话。我的问题是,我如何确定所有期货何时完成?只要多数成功返回,我就可以通过一些请求失败。一旦它们全部返回,我想对所有响应的聚合进行一些计算。

我如何确定所有期货何时完成,因为我事先并不知道x会有多少?{/ p>

1 个答案:

答案 0 :(得分:0)

你可以使用flatMap编写你的期货,下面的例子使用url数组发送多个请求连接所有结果体:

def compser = Action.async {
        val urls = List("http://jmaghreb.io","http://google.com","http://yahoo.fr","http://moroccojug.org")
        val futures:List[Future[WSResponse]] = urls.map(u=> WS.url(u).get())

        var f = futures.foldLeft[Future[String]](Future[String]{""})((e,c)=>{
          e.flatMap(oldRes => c.map(x=>oldRes+" ==> "+x.body))
        })

        f.map(s => Ok(s)).recover({case f=> Ok(s"Failure $f")})
      }

通过这种方式,您可以连接所有期货结果。

如果要忽略失败的请求,可以在flatMap中添加recover,如下所示:

var f = futures.foldLeft[Future[String]](Future[String]{""})((e,c)=>{
  e.flatMap(oldRes => {
    c.map(x=>oldRes+" ==> "+x.body).recover({case f=> oldRes })
  })
})