我创建了Master actor和child actor(使用routerMaster 创建).
师父收到一些工作并将这份工作分成小任务,并将其发送给儿童演员(路由者).
我试图解决的问题是,当儿童演员完成工作时,我如何正确地通知我的主人?
在一些教程(Pi近似,以及来自Scala In Action书中的示例)中,主要角色接收到来自孩子的响应,试图将初始任务数组的大小与接收结果的大小进行比较:
if(receivedResultsFromChildren.size == initialTasks.size) {
// it's mean children finished their job
}
Run Code Online (Sandbox Code Playgroud)
但我认为这是非常糟糕的,因为如果某个子actor抛出异常,那么它将不会将结果发送回发送者(返回Master),因此这种情况永远不会评估为true.
那么如何正确通知大师所有孩子都完成了他们的工作?
我认为其中一个选择是给 Broadcast(PoisonPill)孩子然后听Terminated(路由器)消息(使用所谓的deathWatch).可以解决吗?
如果使用Broadcast(PoisonPill)更好,那么我是否应该注册一些监督策略,以便在例外的情况下停止一些被告?因为如果发生异常,那么就像我所知,将重新启动routee,这意味着Master actor永远不会收到 Terminated(路由器).这是对的吗?
在Akka,这实际上非常简单.
成功的孩子可以向父演员发送普通的回复消息.失败的参与者的意外失败可以在监督策略中被捕获并且被适当地处理(例如通过重新启动演员,或者通过停止它并将其从演员列表中移除来等待).
所以看起来像这样:
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
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2159 次 |
| 最近记录: |