我想知道如何有效地清理动态创建的akka演员。
提供一些背景知识:
每个事件创建的Actor层次结构。
主管 - > child1 - > grandChild1
在我的应用程序中,supervisor actor动态创建其他actor(在周期性事件上)。我希望在该事件的处理步骤完成后清理演员。
所以,我想在处理完成后杀死所有的儿童演员。
这是主管演员的代码。
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的正确方法吗?如果这种方法有任何不利之处或是否有一种模式可以遵循?
答案 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时不要广播消息