TimeOut的作用和时间传递给Await.result

时间:2018-05-20 07:24:25

标签: akka

我有一个在127.0.0.1:2552上运行的akka​​ actor服务。

我正试图从客户端访问它,如下所示:

val client = new SClient("127.0.0.1:2552")
describe("akkaDbClient") {
it("should set a value"){
  client.set("123", new Integer(123))
  val futureResult = client.get("123")
  val result = Await.result(futureResult, 10 seconds)
  result should equal(123)
 }
}

class SClient(remoteAddress: String){
private implicit val timeout = Timeout(2000)
private implicit val system = ActorSystem("LocalSystem")
private val remoteDb = 
   system.actorSelection(s"akka.tcp://akkadb@$remoteAddress/user/akka-db")

def set(key: String, value: Object) = {
 remoteDb ? SetRequest(key, value)
}

def get(key: String) = {
  remoteDb ? GetRequest(key)
 }
}

我无法理解TimeOut和传递给Await.result()的时间参数的作用。

这些值表示什么,它们如何影响程序?

1 个答案:

答案 0 :(得分:2)

Future在后台执行,而不是在主线程上执行。如果计算量很大,则可能需要很长时间。或者更糟糕的是,如果存在无限循环且未来永远不会返回。

在等待它完成之前,这不是问题(在实用意义上)。它会像正常的无限循环一样阻止执行。因此,您可以指定一个超时,以确定在结果停止之前等待结果的时间为TimeoutException

如果client.get(123)花费的时间超过10秒,您将收到异常,测试将失败。否则,在手动终止进程之前,它永远不会返回并运行。

More reading about Futures

关于第二次超时:你要求你的演员有一个可能的回应的未来。这也可能超时。

在您的特定示例中,如果您的actor需要超过两秒钟,则会发生超时。但是,如果你实例化map,flatmapped,过滤未来然后返回它,这些操作将在十秒后超时。

implicit val timeout = Timeout(2000)

val f1 = actor ? message // timout of 2 seconds
val f2 = f1 map longRunningOperation

Await.result(f2, 10 seconds) // timeout of 10 seconds