在Akka中Ask的默认超时是多少?

问题描述 投票:0回答:2

Akka中Ask的超时默认值是多少?

在Akka中使用ask方法所需的只是导入akka.pattern.ask。在文档中,有一些问题的例子,其中没有直接提供超时或作为隐式val。

https://doc.akka.io/docs/akka/2.5/actors.html

我已经阅读了问自己的源代码,但找不到为超时提供的默认值。但是,即使没有提供超时,ask方法也能正常工作,这意味着在某处使用默认值。

这是什么默认值,它是如何提供的?

scala akka reactive-programming
2个回答
1
投票

没有默认超时。必须提供特定的超时值才能通过手动传入或使用隐式val来询问。在第二种情况下,隐式val可能不一定出现在使用ask的同一文件中,具体取决于ask在调用时可以看到的其他命名空间。

我复制了Akka Cookbook的一些代码,如下所示

import akka.actor.{Actor, Props, ActorSystem}
import akka.pattern.ask
import akka.util.Timeout
import scala.concurrent.Await
import scala.concurrent.duration._

class FibonacciActor extends Actor {
  override def receive: Receive = {
    case num : Int =>
      val fibonacciNumber = fib(num)
      sender ! fibonacciNumber
  }

  def fib (n : Int) : Int = n match {
    case 0 | 1 => n
    case _ => fib(n-1) + fib(n-2)
  }
}

object FibonacciActorApp extends App {
  implicit val timeout = Timeout(3.seconds)
  val actorSystem = ActorSystem("HelloAkka")
  val actor = actorSystem.actorOf(Props[FibonacciActor])
  val future = (actor ? 10).mapTo[Int]
  val fibonacciNumber = Await.result(future, 10 seconds)
}

如果没有提供的Timeout值,代码将无法编译。

发生的事情是我在工作时正在查看一些代码,这些代码似乎不会在调用ask的同一文件中提供超时。超时在调用我的文件的较大命名空间中显示为隐式val。因此必须提供超时,但是根据代码库,该超时可能不在调用ask的同一文件中。通过在代码库中搜索akka.util.Timeout类的所有用法,我找到了超时出现的位置。


0
投票

如果你看一下akka.pattern.AskableActorRef类,你会发现ask方法有一个隐含的Timeout参数。这意味着必须在某处隐式定义Timeout实例,或者明确地传递。否则它将无法工作。

protected def ?(message: Any)(implicit timeout: akka.util.Timeout): Future[Any]

在您的情况下,Timeout很可能通过隐式查找解决。尝试使用隐式查找的定律来查找实例。

Implicit lookup

© www.soinside.com 2019 - 2024. All rights reserved.