我需要调用可能或不能及时返回结果的服务.我希望能够写作
val result = runWithTimeout(5000, valReturnedOnTimeout) { service.fetch }
Run Code Online (Sandbox Code Playgroud)
是否有一个标准函数可以完成这项工作 - 比如Ruby的超时?
归功于其他答案 - 在没有任何标准库功能的情况下,我已经走下了期货路线.
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent._
import scala.concurrent.duration._
def runWithTimeout[T](timeoutMs: Long)(f: => T) : Option[T] = {
Await.result(Future(f), timeoutMs milliseconds).asInstanceOf[Option[T]]
}
def runWithTimeout[T](timeoutMs: Long, default: T)(f: => T) : T = {
runWithTimeout(timeoutMs)(f).getOrElse(default)
}
Run Code Online (Sandbox Code Playgroud)
以便
@Test def test {
runWithTimeout(50) { "result" } should equal (Some("result"))
runWithTimeout(50) { Thread.sleep(100); "result" } should equal (None)
runWithTimeout(50, "no result") { "result" } should equal ("result")
runWithTimeout(50, "no result") { Thread.sleep(100); "result" } should equal("no result")
}
Run Code Online (Sandbox Code Playgroud)
对于这是否是一个很好的Scala风格的任何反馈,我将不胜感激!
你可以使用未来
import scala.actors.Futures._
val myfuture =
future {
Thread.sleep(5000)
println("<future>")
"future "
}
awaitAll(300,myfuture ) foreach println _
Run Code Online (Sandbox Code Playgroud)
但是还要看看Scala的Circuit Breaker,这是Circuit Breaker Pattern的一个实现 .基本上,它允许您控制超时以及在访问外部资源时发生故障时应该发生的情况
用法在Scala中看起来像这样(来自自述文件):
. . .
addCircuitBreaker("test", CircuitBreakerConfiguration(timeout=100,failureThreshold=10))
. . .
class Test extends UsingCircuitBreaker {
def myMethodWorkingFine = {
withCircuitBreaker("test") {
. . .
}
}
def myMethodDoingWrong = {
withCircuitBreaker("test") {
require(false,"FUBAR!!!")
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6850 次 |
| 最近记录: |