代码之家  ›  专栏  ›  技术社区  ›  Achilleus

阿克卡监管违约行为

  •  0
  • Achilleus  · 技术社区  · 5 年前

    我正在努力学习阿卡监督战略。当我有下面这样的代码时,我会得到这个

    java.lang.arithmeticException:/by零

    case object CreateChildren
    case class DivideNumbers(n: Int , d:Int)
    object SuperVision extends App {
      val actorSystem = ActorSystem("SupervisingActorSystem")
      val actor = actorSystem.actorOf(Props[ParentActor], "ParentActor")
      actor ! CreateChildren
      val child1 = actorSystem.actorSelection("/user/ParentActor/childActor")
      child1 ! DivideNumbers(4,0)
    
    class ParentActor extends Actor{
      override def receive: Receive = {
        case CreateChildren =>
          context.actorOf(Props[ChildActor], "childActor")
      }
    }
    
      class ChildActor extends Actor{
        override def receive: Receive = {
          case DivideNumbers(n,d) => println(n/d)
    
        }
      }
    
      actorSystem.terminate()
    }
    

    但是当我没有创造出儿童演员并且有类似的东西时,我看不到例外。

    val actorSystem = ActorSystem("SupervisingActorSystem")
      val actor = actorSystem.actorOf(Props[ParentActor], "ParentActor")
      actor ! DivideNumbers(4, 2)
    
      class ParentActor extends Actor {
        override def receive: Receive = {
          case DivideNumbers(n, d) => println(n / d)
          //case DivideNumbers(n, d) => throw new Exception
          //Even this doesn't throw an exception
        }
      }
    
      actorSystem.terminate()
    
    1. 为什么我没有看到例外,我是不是错过了什么?
    2. 这背后的原因是什么 行为?
    3. 当我们 只有一个演员没有孩子?
    1 回复  |  直到 5 年前
        1
  •  1
  •   atline    5 年前

    您没有得到异常,只是因为在异常引发之前,您的参与者系统已终止,然后应用程序退出。

    尝试添加 Thread.sleep(1000) 之前 actorSystem.terminate() ,您将看到异常。

    顺便说一句:这种行为与 if you use only one actor or with a child . 如果只是因为子级是与时间序列相关的随机行为而使用它,则会得到异常。