在哪里关闭演员

时间:2014-04-25 23:19:46

标签: scala akka

我们有很多演员被创建为

class BankActor extends Actor{
   def receive ={
      case CreateCustomer(message) => context.actorOf(Props[CustomerActor]) ! message
  }
}

CustomerActor以类似的方式创建其他actor。以这种方式创建actor的原因可能是BankActor将在其中接收数百(甚至数千)个CreateCustomer消息。我认为在运行中创建它们是一种更好的方法(鉴于Actor的内存占用率较低)。我不认为拥有CustomerActor的“池”是正确的,因为biz req很明显会有很多很多“CreateCustomer”消息。你可以分享一下你的看法吗?现在回过头来关于停止“CustomerActor”的问题:我应该在“CustomerActor”的“接收”方法中执行context.stop(self),它应该是每个“case”块中的最后一个吗?围绕这个最好的做法是什么?

1 个答案:

答案 0 :(得分:1)

除非你有充分的理由,否则请避免创建顶级演员。 (使用context.actorOf)

如果您不想在创建的actor中对关闭进行编码,请在“消息”之后向新创建的actor发送PoisonPill。

class BankActor extends Actor{
   def receive = {
      case CreateCustomer(message) =>
        val customer = context.actorOf(Props[CustomerActor])
        customer ! message
        customer ! PoisonPill // message ordering is preserved on a per-sender basis (for all normal mailboxes)
  }
}