Scala 阿克卡。如何知道所有的儿童演员都完成了他们的工作

Scala 阿克卡。如何知道所有的儿童演员都完成了他们的工作,scala,akka,Scala,Akka,我创建了主角色和子角色(使用主角色的路由器创建) Master接收一些作业并将此作业拆分为小任务,并将它们发送给子参与者(路由者) 我试图解决的问题是,当儿童演员完成他们的工作时,我如何才能正确地通知我的主人 在一些教程(以及Scala In Action book中的示例)中,主参与者在收到孩子们的响应后,试图比较任务初始数组的大小和收到的结果的大小: if(receivedResultsFromChildren.size == initialTasks.size) { // it's

我创建了主角色和子角色(使用主角色的
路由器创建)

Master接收一些作业并将此作业拆分为小任务,并将它们发送给子参与者(路由者)

我试图解决的问题是,当儿童演员完成他们的工作时,我如何才能正确地通知我的主人

在一些教程(以及Scala In Action book中的示例)中,主参与者在收到孩子们的响应后,试图比较任务初始数组的大小和收到的结果的大小:

if(receivedResultsFromChildren.size == initialTasks.size) {
    // it's mean children finished their job
}
但我认为这是非常糟糕的,因为如果某个子参与者抛出异常,那么它将不会将结果发送回发送者(返回主对象),因此该条件的计算结果将永远不会是
true

那么,如何正确地通知师父所有的孩子都完成了他们的工作呢

我认为其中一个选择是
向儿童播放(毒药)
,然后收听
终止(
路由器
消息(使用所谓的
死亡之路
)。这样可以吗


如果使用
广播(毒药)
更好,那么我是否应该注册一些监控策略,以便在异常情况下阻止某些路由?因为若发生异常,那个么routee将重新启动,正如我所知,这意味着主参与者将永远不会收到终止的
router
。对吗

在阿克卡,这其实很简单

成功的子级可以向父级参与者发送普通的回复消息。失败参与者的意外故障可以在监督策略中捕获并适当处理(例如,重新启动参与者,或停止参与者并将其从等待参与者列表中删除)

所以它可能看起来像这样:

var waitingFor = Set.empty[ActorRef]

override def preStart() = ??? // Start the children with their subtasks

override def supervisionStrategy = OneForOneStrategy() {
    case _ => {
       waitingFor -= sender()
       if (waitingFor.isEmpty) ??? // processing finished
       Stop
    }
}

override def receive = {
    case Reply => {
        waitingFor -= sender()
        if (waitingFor.isEmpty) ??? // processing finished
    }
}

在一般情况下,这似乎是一个好主意,即使工人演员不是儿童演员。然而,我想解决一个稍微不同的问题:我想在所有儿童演员都停止的那一刻停止一个演员。这里最简单的解决方案是什么?