ScalaWS的并发请求(Play Framework)

时间:2017-12-22 22:27:40

标签: scala playframework

def resolve(url: String): Future[WSResponse] = ws.url(url).withFollowRedirects(true).get()

def validateAllLinks(links: List[String]) = ???

你将如何解决第二个功能?

我试过遍历,Future.sequence,Await ......

这是我最近的尝试:

def validateAllLinks(links: List[String]) = links.map(link =>
    Await.result(resolve(link), Duration.create(3, TimeUnit.SECONDS))
)

这种方法的问题:

  1. 我得到了TimeoutExceptions和MaxRedirectException,我不想尝试/抓住

  2. 我不认为解决方案会并发,即使它有效。

  3. 提前致谢!

1 个答案:

答案 0 :(得分:3)

随意使用Future.sequence,它们将并行运行:

def validateAllLinks(links: List[String]): Future[List[WSResponse]] = 
    Future.sequence(links.map(resolve))

如果您在Await.result之后致电Future.sequence,它将等待并行操作完成:

import scala.concurrent.duration._
def validateAllLinks(links: List[String]): List[WSResponse] = 
    Await.result(Future.sequence(links.map(resolve)), 10 seconds)

但请注意Await.result被视为不良做法,您应该尝试返回Future,并让客户决定如何处理它。

更详细一点,说明为什么这是一个不好的做法:

  1. https://monix.io/docs/2x/best-practices/blocking.html

  2. https://github.com/alexandru/scala-best-practices/blob/master/sections/4-concurrency-parallelism.md#45-should-not-block