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

6yt4nkrj  于 2023-06-22  发布在  其他
关注(0)|答案(2)|浏览(190)

Akka中Ask超时的默认值是多少?
在Akka中使用ask方法所需的一切就是导入akka.pattern.ask。在文档中,有一些ask的例子,其中没有直接提供超时或作为隐式瓦尔提供超时。
https://doc.akka.io/docs/akka/2.5/actors.html
我已经阅读了ask myself的源代码,但找不到为超时提供的默认值。但是,ask方法即使在没有提供超时时也能正常工作,这意味着在某些地方使用了默认值。
这个默认值是什么,它是如何提供的?

sqyvllje

sqyvllje1#

没有默认超时。必须通过手动传入或使用隐式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)
}

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

gab6jxml

gab6jxml2#

如果你看一下akka.pattern.AskableActorRef类,你会发现ask方法有一个隐式的Timeout参数。这意味着必须在某处隐式定义Timeout示例,或者显式传递。否则就不会成功。

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

在您的例子中,Timeout很可能是通过隐式查找解决的。尝试使用隐式查找法则来查找示例。
Implicit lookup

相关问题