为什么我没有得到Ask超时异常?

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

我有两个演员,一个主管和一个儿童演员。

主管:

class DemoActorSupervisor(implicit val system: ActorSystem, config: Config) extends Actor {

  val childActor: ActorRef = context.actorOf(FromConfig.props(Props[DemoActorChild]), "DemoChildActor")

  context.watch(childActor)

  override def receive: Receive = {
    case s: String =>
      childActor forward s
  }
}

儿童演员:

class DemoActorChild extends Actor {
  def receive: Receive = {
    case s: String =>
      Thread.sleep(100)
      Future.successful(true) pipeTo (sender)
  }
}

主要方法:

object ABC extends App {
  implicit val system: ActorSystem = ActorSystem("Demo")

  implicit val config: Config = ConfigFactory.load()

  implicit val timeout: Timeout = Timeout(5, TimeUnit.MILLISECONDS)

  val supervisor = system.actorOf(DemoActorSupervisor.props(), "DemoSupervisor")

  val x: Future[Boolean] = (supervisor ? ("ASK")).mapTo[Boolean]
  x.foreach(println)
}

我将询问超时设置为5毫秒,然后向主管演员打电话。这是将消息转发给子actor。在儿童演员我已经逻辑地放Thread.sleep(100)我应该得到超时问题,因为我已经将超时设置为5毫秒并且孩子花了超过100毫秒秒回应,但我没有得到超时异常。谁能告诉我代码有什么问题?我怎样才能得到超时异常问题。

scala exception timeout akka
2个回答
2
投票

你可以在Future.foreach的描述中看到:

一旦值可用,将异步处理该值。

警告:如果未来未完成或未成功完成,则不会被调用。

如果你想使用Future.foreach,你应该写如下:

x.map(Success(_)).recover({case exception => Failure(exception)}).foreach(println) 

1
投票

试试下一个:

x.onComplete {
    case Success(v) =>
      println(v)
    case Failure(v) =>
      println(v)
}

Future foreach只处理成功案例,akka.pattern.AskTimeoutException:属于Failure,你需要用你的代码来处理它。

或者下一个也好:

x.foreach(println)
x.failed.foreach(println)
© www.soinside.com 2019 - 2024. All rights reserved.