误解阿卡成为/不成功

时间:2014-02-10 11:33:53

标签: scala akka

以下代码:

class HotSwapActor extends Actor {
  import context._
  def angry: PartialFunction[Any, Unit] = {
    case "foo" => sender ! "I am already angry!"
    case "bar" => become(happy)
  }

  def happy: PartialFunction[Any, Unit] = {
    case "bar" => sender ! "I am already happy :-)"; unbecome
    case "foo" => become(angry)
  }

  def receive = {
    case "foo" => become(angry)
    case "bar" => become(happy)
  }
}

class OtherActor extends Actor {
  val system = ActorSystem()
  val actor = system.actorOf(Props[HotSwapActor])
  def receive = {
    case "start" =>
      actor ! "foo"
      actor ! "bar"
      actor ! "bar"
      actor ! "foo"
    case a @ _ => println(a)
  }
}

object HotSwapMain extends App {
  val system = ActorSystem()
  val actor = system.actorOf(Props[OtherActor])
  actor ! "start"
}

有输出:

  

我很高兴: - )

但不是吗

  

我已经开心了:-)我已经生气了!

或者我在幸福的PartialFunction的案例中错过了 unbecome 中的不良语义?

2 个答案:

答案 0 :(得分:26)

这就是流程。

  1. 已发送消息“foo” - > receive收到消息。 angry成为接收函数。任何下一条消息都将发送到angry
  2. 已发送消息“bar” - > angry收到消息。 happy成为接收函数。任何下一条消息都将发送到happy
  3. 已发送消息“栏” - > happy收到消息。它回复了I am already happy :-)消息。然后它unbecomes。 对context.become以前的所有调用按照apidiscardOld默认设置为true。现在更换后,没有什么可以成为下一个接收器。它采用默认值,即receive作为接收器

  4. 已发送消息“foo” - > receive收到消息。 angry成为接收函数。任何下一条消息都将发送到angry

答案 1 :(得分:3)

成为可选的第二个参数'discardOld'。默认情况下这是真的。这样就不会维护堆栈。如果你想要维护堆栈,并得到结果 - “我已经开心了:-)我已经生气了!”,将参数discardOld = false传递给你的函数。