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