2015-05-29 78 views
3

我试图实现一个简单的应用程序,我将不同的任务分配给Akka actors并让他们独立计算结果。问题是如何检测何时他们全部已完成分配的作业(成功或失败计数),因为我需要从中获得计算结果。典型的方法是什么?如何检测Akka演员何时完成?

我尝试使用system.shutdown()等待所有actor都完成,但过去这个命令actors已经被终止,并且不响应任何需要的消息来检索计算结果。

我想过的另一件事是从工人演员向他们的父母发送像JobCompleted消息。然后,我可以计算出我返回的这种类型的消息的数量,如果计数等于产生的工人演员,我们知道他们都已完成。虽然我不知道当演员发生失败时会发生什么。而且这种方法似乎太笨重了。

+1

可能的重复[了解akka演员完成时](http://stackoverflow.com/questions/17606505/knowing-when-akka-actors-are-finished) – Daenyth

+0

您应该使用'ask'模式作答复和观看使用父母演员本身的儿童演员或使用“收割者”模式。 – 757071

回答

0

当您创建“作业”并将它们发送给工作人员时,您可以使用询问模式创建结果的未来。

这看起来是这样的:

val myActorRef = system.actorOf(Props(classOf[WorkerActor]), "worker") 

val result = (myActorRef ? SomeComputationMessage()).mapTo[Result] 

如果演员将其结果返回给调用者与sender ! Result()那么这个问格局将返回一个未来的结果

由于这些都是期货结果,可以映射在他们,与他们适当的工作基础上成功/失败

http://doc.akka.io/api/akka/2.0/akka/pattern/package.html

0

我会有一个协调角色,派生工人,然后发送每条消息指定它要做的工作,为每个工人建立一个持有ActorRefs的集合。当在协调器中接收到一个JobCompleted(或者如果合适的话,JobFailed)消息时,累积结果并从该集合中删除该消息的发送者(即Worker的ActorRef)。当该集合为空时,所有工作人员都已完成。工作人员自己可以致电context.stop(self),一旦他们发送了他们的信息,就可以自行终止。

进一步的语义将取决于具体的工作。例如,协调员可以设置回自己的预定呼叫(例如,呼叫context.system.scheduler.schedule(someDelay, someDelay, self, ResendWorkOrders)将每个someDelay间隔发送一次ResendWorkOrders消息给自己。当它接到这个呼叫时,它可以将工作请求重新发送给集合中剩下的每个工作人员(或者甚至重新生成)。当设置为空(所有工人已经完成),调度可以取消(调用调度返回Cancellable)。例如,这可以处理可能无法向工作人员传递消息的情况(例如在分布式系统中),或者工作人员可能在未答复协调员的情况下出现故障或出错的情况。