处理完成后Akka停止/杀死演员

时间:2016-03-30 18:16:08

标签: scala akka actor

我想知道如何有效地清理动态创建的akka​​演员。

提供一些背景知识:

每个事件创建的Actor层次结构。

主管 - > child1 - > grandChild1

在我的应用程序中,supervisor actor动态创建其他actor(在周期性事件上)。我希望在该事件的处理步骤完成后清理演员。

所以,我想在处理完成后杀死所有的儿童演员。

  1. 我在创建的反向成功完成后传播消息(successfulProcessing)。 (孙子1 - > child1 - >主管)。  在主管中,我将向孩子演员发送PoisonPill。
  2. 这是主管演员的代码。

    class Supervisor extends Actor {
        def receive={
            case onEvent: OnEvent =>
                //Create child actor and send message         
            case successfulProcessing =>
                sender() ! PoisonPill
        }
        override val supervisorStrategy = AllForOneStrategy() {
            case e: Exception =>
                Stop   
        }
    }
    

    这是清除动态创建的actor的正确方法吗?如果这种方法有任何不利之处或是否有一种模式可以遵循?

2 个答案:

答案 0 :(得分:1)

我见过的模式是有一个管理其他演员的演员。在this tutorial的以下示例中,actor1管理actor2,其中actor2执行所有工作。 actor1然后清理。

case class StartCounting(n: Int, actor: ActorRef)
case class CountDown(n: Int)

class CountDownActor extends Actor {
  def receive = {
    case StartCounting(n, actor) =>
      println(n)
      actor ! CountDown(n-1)
    case CountDown(n) =>
      if(n > 0) {
        println(n)
        sender ! CountDown(n-1)
      } else {
        context.system.shutdown()
      }
  }
}

object Main extends App {
  val system = ActorSystem("HelloSystem")
  // default Actor constructor
  val actor1 = system.actorOf(Props[CountDownActor], name = "manager")
  val actor2 = system.actorOf(Props[CountDownActor], name = "worker")
  actor1 ! StartCounting(10, actor2)
}

您可以将此视为递归:基础和归纳案例。您可以在深度上为所有兄弟演员管理他们的父母。

答案 1 :(得分:1)

根据Akka Document 2.4.14, 处理PoisonPill / Kill消息的更好方法是广播它们。

    ActorRef ! Broadcast(PoisonPill)

注意:使用BalancingPool时不要广播消息