2017-03-21 9 views
0

ScalaとAkkaを使用して小さなHTTPサーバーを実装したいと思います。具体的には、EmployeeRouterActorとEmployeeEchoActorの2種類のアクターが必要です。ScalaでAkkaを使用して親子モデルを実装する方法は?

私はルータのように使用したいと思います。つまり、そのアクタはすべてのメッセージを受信し、各メッセージに対して子(この場合はEmployeeEchoActor)を作成する必要があります。

それぞれの子は、従業員メッセージを受信し、従業員情報の文字列を返す必要があります。

さらに、子供がそのプロセスを完了した後、子供は死ぬ必要があります。親は自分の子供のライフサイクルを管理しなければならないと思う。アッカのドキュメントで

、私は私がこれをどのように行うことができますthis

のように、単一の子供の使用についてを参照してください? Akkaサイトのサンプルやその他のドキュメントはありますか?このような

答えて

3

何か:

object EmployeeRouterActor { 
    final case class Employee(id: String, name: String) 
    final case object StopChild 
    final case class ChildResponse(id: String, data: String) 
} 

final class EmployeeRouterActor extends Actor { 
    import EmployeeRouterActor._ 

    // Make a map which will store child actors 
    private var children = Map.empty[String, ActorRef] 

    override def receive: Receive = { 
    case e @ Employee(id, _) => getChild(id) ! e 
    case ChildResponse(id, _) => stopChild(id) 
    } 

    // Check whether child exists in context of this actor. 
    // If it doesn't, create new one. 
    private def getChild(id: String): ActorRef = 
    context.child(id).getOrElse { 
     val child = context.actorOf(EmployeeEchoActor.apply(), id) 
     children += (id -> child) 
     child 
    } 

    private def stopChild(id: String) = { 
    children(id) ! StopChild 
    children -= id 
    } 
} 

object EmployeeEchoActor { 
    def apply(): Props = Props(new EmployeeEchoActor) 
} 

final class EmployeeEchoActor extends Actor { 
    // self.path.name to access its id 
    override def receive: Receive = { 
    case EmployeeRouterActor.Employee => 
     // do stuff with Employee message... 
     context.parent ! EmployeeRouterActor.ChildResponse(self.path.name, "Done!") // Or pipeTo(context.parent) 
    case EmployeeRouterActor.StopChild => context.stop(self) 
    } 
} 

基本的には、子役はMapに作成され、保存されています。彼らは自分の仕事を終えると、彼らの親に応答メッセージを返信し、それを止める。

+0

お返事ありがとうございました。私は私のプロジェクトであなたのソリューションをチェックします。 –

+0

私はこのソリューションを実装し、ChildResponseを受け取った後でEmployeeRouterActorがレスポンスを返すときに常にデッドレターを受け取ることを除いて正常に動作します。私はそれに取り組んでいます。助けてくれてありがとう。 –

関連する問題