2015-09-12 94 views
1

我對scala和akka很新穎。我想知道,一旦演員完成其工作,就會終止所有其他演員。一旦一個演員完成其工作,終止所有其他演員

代碼的基本結構如下。有一位主管負責5名工人,這些工人由RoundRobinPool生成。每個工人都在做一些工作,並將結果發回給主人。我需要意識到的是讓主人在其中一人完成工作並將其送回主人時終止所有其他工作人員。然後主機會向主函數發送一些相對值,然後整個程序終止。

任何想法如何實現?

//Code:  
object X{ 
    sealed trait Message 
    case class Result() extends Message 
    case class Work() extends Message 
    case class Result() extends Message 
    case class Totalresult() extends Message 
    class Worker extends Actor{ 
     def receive={ 
      case Work => 
      sender ! Result} 
    }//End of class Worker   
    class Master(nrOfWorkers: Int) extends Actor{ 
     val workerRouter =context.actorOf(RoundRobinPool(nrOfWorkers).props(Props[Worker]))) 
     def receive={ 
      case Calculate => calculateSender=sender     
      case Result => calculateSender ! Totoalresult() 
     } 
    }//End of class Master 
    def main(args: String) { 
     val system =ActorSystem("mysystem") 
     val master=system.actorOf(Props(new Master(5),name="master") 
     val future=master ? Calculate 
    } 
} 

回答

0

阿卡的主要監督方面之一是給定的演員被認爲對其子女負責。在這種情況下,這意味着「主」演員的死亡將自動導致其所有子女的終止,所以您真正需要做的就是讓「主」演員終止自己。這可以通過多種方式完成,例如通過向自身發送KillPoisonPill消息 - 例如,在將TotalResult消息發送回calculateSender之後直接添加行:self ! PoisonPill

請注意,在您的代碼中描述的特定場景中,您設置爲接收未來的主要結果,但不包括任何處理(例如onComplete呼叫或使用Await)那結果。在這種處理過程中,您可以包含對system.shutdown()的呼叫,而不是讓「主人」自行終止,然後終止所有參與者作爲關機過程的一部分 - 只要確保在未來(以及因此演員背後的努力)已經完成。

PS:請參閱this question瞭解有關終止演員的不同方式之間差異的更多信息。

+0

感謝您的回覆。我已經按照你所說的去嘗試殺死主人,儘管結果是好的,但是從終端上也可以看出,工作的其餘部分給主人的信息沒有交付。我意識到這是由於主演終止,但這個警告只是令人討厭。有什麼方法可以擺脫這種情況嗎? –

+0

@ChenChen如果您正在討論發送給死信隊列的消息的警告,因爲預期的收件人已經死亡,我確信有一個設置控制這些消息的日誌記錄(我認爲記錄的消息甚至提到了這一點) 。通常我認爲這些消息是相對無害的,並且可能只是幫助調試更嚴重的問題。 – Shadowlands

+0

是的,你是對的。我檢查文件說它可以通過添加:'akka {log-dead-letters-during-shutdown = on}'來完成。我是不是把這個放在導入行或者sbt之後? –