cer*_*ran 4 web-services scala playframework playframework-2.0
我正在使用异步 Play WS Scala API 来查询 RESTful 服务。我想知道如何处理List要通过调用的包含请求 URL WSClient,但每秒不超过一个请求(该服务允许每个客户端每秒“仅”1 个请求)。从逻辑的角度来看,这个想法是从列表中获取一个元素 (URL),发出请求,然后在继续处理列表中的下一个元素之前等待一段时间。
Thread.sleep在像 Play 这样的非阻塞和异步框架中使用 good old肯定是一个坏主意。ScheduledThreadPoolExecutor需要生成新线程的类似方法或其他方法,情况可能也是如此。如何在不对 Play 的异步和“尽可能少线程”性质产生负面影响的情况下限制请求率?
假设您有一个要获取的 URL 列表:
val urls = List(
"http://www.google.com",
"http://stackoverflow.com",
"http://www.bing.com"
)
Run Code Online (Sandbox Code Playgroud)
在 Play 2.5.x 中,我们可以顺序处理这些,并用于akka.pattern.after在每次调用之间强制异步延迟。我们flatMap将Futureweb 服务调用的结果在一秒后返回相同的值。
Future.traverse(urls) { url =>
wsClient.url(url).get().flatMap { result =>
// potentially process `result` here
akka.pattern.after(1.second, actorSystem.scheduler)(Future.successful(result))
}
} // returns Future[List[WSResponse]]
Run Code Online (Sandbox Code Playgroud)
这要求您有一个WSClient和ActorSystem组件可用,以及隐式ExecutionContext作用域。
在 Play 2.4.x 及更早版本中,您可以使用Promise.timeout以下命令执行相同操作:
Future.traverse(urls) { url =>
wsClient.url(url).get().flatMap { result =>
// potentially process `result` here
Promise.timeout(result, 1.second)
akka.pattern.after(1.second, actorSystem.scheduler)(Future.successful(result))
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1845 次 |
| 最近记录: |