【问题标题】:Why i'm not getting Ask timeout exception?为什么我没有收到询问超时异常?
【发布时间】:2019-02-09 02:56:34
【问题描述】:

我有 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


    【解决方案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)
    

    【讨论】:

    • onComplete 正在失败的情况下工作,如果我会正确 ex.printStackTrace 它会打印但为什么 foreach 不能那样工作。为什么我必须明确指出这是一个失败的未来或成功?如果我在做future.foreach,Throwable 将被包裹在future.foreach 中,所以future 中的内容应该打印出来。
    • 如果我什至不做 pipeTo 发送结果怎么办?那么会是什么情况呢?
    【解决方案2】:

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

    一旦值变得可用,将在未来异步处理该值。

    警告:如果这个未来永远不会完成或完成失败,则不会被调用。

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

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

    【讨论】:

      猜你喜欢
      • 2019-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-08
      • 2013-02-10
      • 2014-07-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多