我有一个在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()的时间参数的作用。
这些值表示什么,它们如何影响程序?
答案 0 :(得分:2)
Future在后台执行,而不是在主线程上执行。如果计算量很大,则可能需要很长时间。或者更糟糕的是,如果存在无限循环且未来永远不会返回。
在等待它完成之前,这不是问题(在实用意义上)。它会像正常的无限循环一样阻止执行。因此,您可以指定一个超时,以确定在结果停止之前等待结果的时间为TimeoutException
。
如果client.get(123)
花费的时间超过10秒,您将收到异常,测试将失败。否则,在手动终止进程之前,它永远不会返回并运行。
关于第二次超时:你要求你的演员有一个可能的回应的未来。这也可能超时。
在您的特定示例中,如果您的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