代码之家  ›  专栏  ›  技术社区  ›  Raman Mishra

为什么我没有收到询问超时异常?

  •  0
  • Raman Mishra  · 技术社区  · 6 年前

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

    主管:

    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)
    }
    

    我将ask超时设置为5毫秒,并对主管演员执行ask调用。正在将消息转发给子参与者。在我放的儿童演员里 Thread.sleep(100) 从逻辑上讲,我应该得到ask timeout异常,因为我将timeout设置为5 mili秒,而child的响应时间超过100 mili秒,但我没有得到ask timeout异常。 有人能告诉我密码有什么问题吗?如何获得ask超时异常。

    2 回复  |  直到 6 年前
        1
  •  2
  •   Aleksey Isachenkov    6 年前

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

    当该值变为可用时,将在将来异步处理该值。

    警告:如果此未来从未完成或完成时失败,将不会调用。

    如果你想用 未来 你应该写一些像:

    x.map(Success(_)).recover({case exception => Failure(exception)}).foreach(println) 
    
        2
  •  1
  •   atline    6 年前

    尝试下一步:

    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)