2015-05-29 79 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)。例如,這可以處理可能無法向工作人員傳遞消息的情況(例如在分佈式系統中),或者工作人員可能在未答覆協調員的情況下出現故障或出錯的情況。