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

时间:2019-03-05 00:15:04

标签: scala akka reactive-programming

Akka中Ask超时的默认值是什么?

在Akka中使用ask方法所需要的全部就是导入akka.pattern.ask。在文档中,有一些示例询问在哪里没有直接或作为隐式val提供超时。

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

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

此默认值是什么?如何提供此默认值?

2 个答案:

答案 0 :(得分: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)
}

没有提供的超时值,代码将无法编译。

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

答案 1 :(得分:0)

如果查看类Timeout,您会发现ask方法具有隐式的Timeout参数。这意味着必须在某处隐式定义一个protected def ?(message: Any)(implicit timeout: akka.util.Timeout): Future[Any] 实例,否则您将通过显式定义。否则它将无法正常工作。

Timeout

在您的情况下,.paddingRight.tiny { padding-right: 0.5em; } .paddingRight.small { padding-right: 1em; } .paddingRight.medium { padding-right: 1.5em; } .paddingLeft.tiny { padding-left: 0.5em; } .paddingLeft.small { padding-left: 1em; } .paddingLeft.medium { padding-left: 1.5em; } 最有可能通过隐式查找来解决。尝试使用隐式查找法则来查找实例。

Implicit lookup