Akka中Ask超时的默认值是什么?
在Akka中使用ask方法所需要的全部就是导入akka.pattern.ask。在文档中,有一些示例询问在哪里没有直接或作为隐式val提供超时。
https://doc.akka.io/docs/akka/2.5/actors.html
我已经阅读了问我自己的来源,并且找不到为超时提供的默认值。但是,即使没有提供超时,ask方法也可以正常工作,这意味着在某处使用了默认值。
此默认值是什么?如何提供此默认值?
答案 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;
}
最有可能通过隐式查找来解决。尝试使用隐式查找法则来查找实例。