Каково время ожидания по умолчанию в Акке? - PullRequest
0 голосов
/ 05 марта 2019

Какое значение по умолчанию для тайм-аута Ask в Akka?

Все, что необходимо для использования метода ask в Akka, - это импорт akka.pattern.ask.В документах есть примеры вопросов, в которых тайм-аут не указывается ни напрямую, ни в качестве неявного значения.

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

Я сам прочитал источник запроса и не могу найти значение по умолчаниюзначение, предоставленное для тайм-аута.Однако метод ask работает нормально, даже если тайм-аут не указан, то есть где-то используется значение по умолчанию.

Что это за значение по умолчанию и как оно предоставляется для запроса?

Ответы [ 2 ]

0 голосов
/ 05 марта 2019

Если вы посмотрите на класс akka.pattern.AskableActorRef, вы увидите, что метод ask имеет неявный параметр Timeout.Это означает, что должен быть где-то неявно определенный экземпляр Timeout, иначе вы передаете явно.В противном случае это не сработает.

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

В вашем случае Timeout, скорее всего, разрешается с неявным поиском.Попробуйте использовать законы неявного поиска, чтобы найти экземпляр.

Неявный поиск

0 голосов
/ 05 марта 2019

Тайм-аут по умолчанию отсутствует.Чтобы задать запрос, необходимо указать конкретное значение тайм-аута, передав его вручную или используя неявное значение val.Во втором случае неявный val может не обязательно появляться в том же файле, где используется запрос, в зависимости от того, какие другие пространства имен может видеть запрос при вызове.

Я скопировал некоторый код из 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)
}

Код не будет компилироваться без предоставленного значения времени ожидания.

То, что происходит, это то, что я на работе смотрю какой-то код, которыйне отображается тайм-аут в том же файле, где вызывается запрос.Тайм-аут отображается в виде неявного значения val в большем пространстве имен, где вызывается мой файл.Поэтому необходимо указать тайм-аут, но в зависимости от кодовой базы этот тайм-аут может не находиться в том же файле, где вызывается запрос.Я нашел место, где появляется тайм-аут, выполнив поиск в моей кодовой базе для всех применений класса akka.util.Timeout.

...